如何将空地图类型列添加到 DataFrame?

Pin*_* Li 7 scala apache-spark apache-spark-sql

我想向数据框添加一个新的地图类型列,如下所示:

|-- cMap: map (nullable = true)
|    |-- key: string
|    |-- value: string (valueContainsNull = true)
Run Code Online (Sandbox Code Playgroud)

我试过代码:

df.withColumn("cMap", lit(null).cast(MapType)).printSchema
Run Code Online (Sandbox Code Playgroud)

错误是:

<console>:132: error: overloaded method value cast with alternatives:
(to: String)org.apache.spark.sql.Column <and>
(to: org.apache.spark.sql.types.DataType)org.apache.spark.sql.Column
cannot be applied to (org.apache.spark.sql.types.MapType.type)
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以将新列转换为 Map 或 MapType?谢谢

小智 5

我遇到了同样的问题,最后我找到了解决方案:

df.withColumn("cMap", typedLit(Map.empty[String, String])) 
Run Code Online (Sandbox Code Playgroud)

来自 ScalaDocs 的typedLit

该函数与 [[lit]] 的区别在于该函数可以处理参数化的 scala 类型,例如:List、Seq 和 Map。


Tza*_*har 3

与其他类型不同,MapType它不是一个可以按原样使用的对象(它不是扩展的对象DataType),您必须调用MapType.apply(...)它需要键和值类型作为参数(并返回该类的实例MapType

df.withColumn("cMap", lit(null).cast(MapType(StringType, StringType))) 
Run Code Online (Sandbox Code Playgroud)