我希望将pyspark数据帧的多个列合并到StructType的一个列中。
假设我有一个这样的数据帧:

columns = ['id', 'dogs', 'cats']
vals = [(1, 2, 0),(2, 0, 1)]
df = sqlContext.createDataFrame(vals, columns)

我希望生成的数据帧与此类似(并不是像实际打印的那样,而是如果您还不熟悉structtype,请给出我的意思):
id | animals
1  | dogs=2, cats=0
2  | dogs=0, cats=1

现在我可以实现我想要的:
StructType(
    [StructField('dogs', IntegerType(), True),
    [StructField('cats', IntegerType(), True)
)

然而,在我的udfs的末尾,我宁愿只使用一个函数。如果一个人不存在,我会感到惊讶。

最佳答案

如果需要map列:创建以列名为键的文字列,然后使用create_map函数构造所需的映射列:

from pyspark.sql.functions import create_map, lit
new_df = df.select(
    'id',
     create_map(lit('dogs'), 'dogs', lit('cats'), 'cats').alias('animals')
     #                key  :  val,        key   :   val
)

new_df.show(2, False)
#+---+----------------------+
#|id |animals               |
#+---+----------------------+
#|1  |[dogs -> 2, cats -> 0]|
#|2  |[dogs -> 0, cats -> 1]|
#+---+----------------------+

new_df.printSchema()
#root
# |-- id: long (nullable = true)
# |-- animals: map (nullable = false)
# |    |-- key: string
# |    |-- value: long (valueContainsNull = true)

如果需要struct列:请使用struct函数:
from pyspark.sql.functions import struct
new_df = df.select('id', struct('dogs', 'cats').alias('animals'))
new_df.show(2, False)
#+---+-------+
#|id |animals|
#+---+-------+
#|1  |[2, 0] |
#|2  |[0, 1] |
#+---+-------+

new_df.printSchema()
#root
# |-- id: long (nullable = true)
# |-- animals: struct (nullable = false)
# |    |-- dogs: long (nullable = true)
# |    |-- cats: long (nullable = true)

关于python - PySpark-将DF列合并为命名的StructType,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51846050/

10-12 17:33