gpt4 book ai didi

python - PySpark - 将 DF 列组合成命名的 StructType

转载 作者:搜寻专家 更新时间:2023-10-30 21:49:08 25 4
gpt4 key购买 nike

我希望将 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)
)

但是,在我的 udf 结束时,我宁愿只用一个函数来完成它。如果没有,我会感到惊讶。

最佳答案

如果您需要一个map:创建以列名作为键的文字列,然后使用create_map构建您需要的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com