如何创建类型化的空 MapType?

Posted

技术标签:

【中文标题】如何创建类型化的空 MapType?【英文标题】:How to create a typed empty MapType? 【发布时间】:2018-07-18 20:36:46 【问题描述】:

我有一个要匹配的数据框架构,其中包含MapType(StringType(), StringType()) 类型的列。我尝试了以下实现(使用 Spark 2.2.1):

import pyspark.sql.functions as fx
from pyspark.sql.types import *

df = spark.createDataFrame([[1]], ['id'])
df = df.withColumn("map", fx.udf(dict, MapType(StringType(), StringType()))())
df = df.withColumn("map2", fx.create_map().cast(MapType(StringType(), StringType())))

没有 udf 的第二次尝试给了我这个转换错误:

cannot resolve 'map()' due to data type mismatch: cannot cast MapType(NullType,NullType,false) to MapType(StringType,StringType,true)

是否有正确的方法来编写第二个实现(没有 UDF)?

【问题讨论】:

这能回答你的问题吗? Scala Spark - empty map on DataFrame column for map(String, Int) 【参考方案1】:

我不确定这是否是“正确的方法”,但这里有一种没有udf 的方法:

通过指定架构创建一个新的数据框,并执行crossJoin()

df = spark.createDataFrame([[1]], ['id'])

data = [(,)]
schema = StructType([StructField("map2", MapType(StringType(), StringType()))])
df2 = spark.createDataFrame(data, schema)

df.crossJoin(df2).show()
+---+-----+
| id| map2|
+---+-----+
|  1|Map()|
+---+-----+

【讨论】:

以上是关于如何创建类型化的空 MapType?的主要内容,如果未能解决你的问题,请参考以下文章

pyspark:从现有列创建 MapType 列

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

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

如何将 MapType(StringType, StringType) 的列转换为 StringType?

如何将字符串冒号分隔的列转换为 MapType?

如何将字符串冒号分隔列转换为MapType?