如何将Map列添加到Spark数据集?

时间:2018-09-20 04:21:23

标签: java scala apache-spark dictionary apache-spark-dataset

我有一个Java Map变量,例如Map<String, String> singleColMap。我想将此Map变量添加到数据集中,作为Spark 2.2(Java 1.8)中的新列值。

我尝试了以下代码,但没有用:

ds.withColumn("cMap", lit(singleColMap).cast(MapType(StringType, StringType)))

有人可以帮忙吗?

2 个答案:

答案 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))