我有一个Java Map
变量,例如Map<String, String> singleColMap
。我想将此Map
变量添加到数据集中,作为Spark 2.2(Java 1.8)中的新列值。
我尝试了以下代码,但没有用:
ds.withColumn("cMap", lit(singleColMap).cast(MapType(StringType, StringType)))
有人可以帮忙吗?
答案 0 :(得分:1)
您可以使用文档中的 Spark 2.2.0 中引入的typedLit
:
此功能与点灯之间的区别在于此功能可以处理参数化的Scala类型,例如:List,Seq和Map。
所以在这种情况下,以下内容就足够了
ds.withColumn("cMap", typedLit(singleColMap))
答案 1 :(得分:0)
可以使用typedLit
在Scala中轻松解决,但是我找不到使该方法在Java中工作的方法,因为它需要一个TypeTag
,我认为这不是甚至可以用Java创建。
但是,我设法在Java中大体上模仿typedLit
的功能,并禁止类型推断部分,因此我需要显式设置Spark类型:
public static Column typedMap(Map<String, String> map) {
return new Column(Literal.create(JavaConverters.mapAsScalaMapConverter(map).asScala(), createMapType(StringType, StringType)));
}
然后可以像这样使用它:
ds.withColumn("cMap", typedMap(singleColMap))