有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何向Spark数据集添加映射列?

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

我尝试了以下代码,但不起作用:

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

有人能帮忙吗


共 (2) 个答案

  1. # 1 楼答案

    这在Scala中很容易用typedLit解决,但我找不到一种方法使该方法在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))
    
  2. # 2 楼答案

    您可以使用Spark 2.2.0中介绍的^{},文档如下:

    The difference between this function and lit is that this function can handle parameterized scala types e.g.: List, Seq and Map.

    因此,在这种情况下,以下内容就足够了

    ds.withColumn("cMap", typedLit(singleColMap))