如何从 Pyspark 中的 MapType 列获取键和值

Posted

技术标签:

【中文标题】如何从 Pyspark 中的 MapType 列获取键和值【英文标题】:How to get keys and values from MapType column in Pyspark 【发布时间】:2020-05-20 01:57:45 【问题描述】:

我正在尝试在 PySpark 中复制这个问题的解决方案(Spark How to get keys and values from MapType column in SparkSQL DataFrame 下面是我的代码(与上面链接的问题相同的 df):

import pyspark.sql.functions as F

distinctKeys = df\
  .select(F.explode("alpha"))\
  .select("key")\
  .distinct()\
  .rdd

df.select("id", distinctKeys.map(lambda x: "alpha".getItem(x).alias(x))

但是,此代码给出了错误:AttributeError: 'PipelineRDD' object has no attribute '_get_object_id'。关于如何解决它的任何想法?

【问题讨论】:

【参考方案1】:

尝试将 distinctKeys 创建为字符串列表,然后使用列表推导将每个键设置在自己的列上:

import pyspark.sql.functions as F

# generate a list of distinct keys from the MapType column
distinctKeys = df.select(F.explode("alpha")).agg(F.collect_set("key").alias('keys')).first().keys
# or use your existing method
# distinctKeys = [ d.key for d in df.select(F.explode("alpha")).select("key").distinct().collect() ]

df_new = df.select("id", *[ F.col("alpha")[k].alias(k) for k in distinctKeys ])

【讨论】:

以上是关于如何从 Pyspark 中的 MapType 列获取键和值的主要内容,如果未能解决你的问题,请参考以下文章

在pyspark中展平Maptype列

MapType 列值上的 PySpark 杠杆函数

Spark DataFrame ArrayType 或 MapType 用于检查列中的值

使用 MapType 文字创建新列

如何创建类型化的空 MapType?

如何从 PySpark 中的 JavaSparkContext 获取 SparkContext?