Spark DataFrame中使用别名进行映射聚合?

5

我喜欢使用Spark DataFrame的map聚合语法,就像这样:

jaccardDf
        .groupBy($"userId")
        .agg(
          "jaccardDistance"->"avg"
          , "jaccardDistance"->"stddev_samp"
          , "jaccardDistance"->"skewness"
          , "jaccardDistance"->"kurtosis"
)

有没有一种方法可以在使用Map语法的同时别名化结果列?当我需要别名时,我改用以下方式。
jaccardDf
        .groupBy($"userId")
        .agg(
          avg("jaccardDistance").alias("jaccardAvg")
          ,stddev_samp("jaccardDistance").alias("jaccardStddev")
          ,skewness("jaccardDistance").alias("jaccardSkewness")
          ,kurtosis("jaccardDistance").alias("jaccardKurtosis")
)

你确定地图语法会产生4个不同的列吗?每个新的“jaccardDistance”实例不应该替换前一个实例并产生单个聚合结果吗? - D3V
是的,我确定。当计算而不使用别名时,我会得到通常的列名,例如“avg(jaccardDistance)”。 - Michael West
1个回答

1
使用.toDF()将您定义的列表用作列名的别名:
val colNames = Array("userId", "jaccardAvg", "jaccardStddev", "jaccardSkewness", "jaccardKurtosis") 

jaccardDf
    .groupBy($"userId")
    .agg(
      "jaccardDistance"->"avg",
      "jaccardDistance"->"stddev_samp",
      "jaccardDistance"->"skewness",
      "jaccardDistance"->"kurtosis")
    .toDF(colNames: _*)

1
不知道我可以在数据框上调用 .toDF()。 对我来说,这比必须给每个列取别名更可取。 - Michael West

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接