【问题标题】:Spark dataset alias column on-the-fly like for a dataframeSpark 数据集别名列即时运行,就像数据框一样
【发布时间】:2020-10-04 20:25:31
【问题描述】:

可能是一个非常愚蠢的问题,但是对于:

val ds3 = ds.groupBy($"ip")
            .avg("humidity") 

目前尚不清楚对于数据集(而不是数据框)如何像使用即时别名一样重命名列。我尝试了几件事,但无济于事。尝试时没有错误,但没有效果。

我想将“avg_humidity”作为列名。

扩展问题,如果我发出怎么办:

val ds3 = ds.groupBy($"ip")
            .avg() 

如何处理?

【问题讨论】:

    标签: apache-spark apache-spark-dataset


    【解决方案1】:

    avg 不提供别名函数,您可能需要额外的 withColumnRenamed

    val ds3 = ds.groupBy($"ip")
      .avg("humidity")
      .withColumnRenamed("avg(humidity)","avg_humidity")
    

    您可以改为使用.agg(avg("humidity").as("avg_humidity"))

    val ds3 = ds.groupBy($"ip").agg(avg("humidity").as("avg_humidity"))
    

    【讨论】:

    • 对,真是一团糟。所以你能看看我对这个问题所做的编辑,然后在接受之前对她的答案发表评论吗?谢谢
    • 你的意思是如果你执行ds.groupBy($"ip").avg() ? @thebluephantom 还是您的意思是例外?
    • 在使用这些函数时,我注意到我们再次获得了数据帧——我很久以前就看到了,事实上这似乎并没有改变。令人失望。
    • 哦,现在我明白了@thebluephantom
    • 我正在学习认证,并认为我会检查 DF 与 DS。我仍然看到 DS 的许多问题。只是选择这样的作品,但 AGGR 意味着获得了 DF,是的,我知道可以互换,但还有很多工作要做。无论如何,我可以自己更改所有列,因为我看到您确认的顶级 DS 有限制。干杯
    【解决方案2】:

    groupBy(cols: Column*) 返回一个RelationalGroupedDataset

    avg(colNames: String*) 的返回类型是 DataFrame,因此通过使用 as(alias: String),您只需将别名分配给新的 DataFrame,而不是列。

    关于重命名 DataFrame 中的列的讨论是 here

    【讨论】:

    • Thx 稍后再看。证实了我的观点,即 DF 更容易。
    • 所以,我又回到了万年前。我从 RGD 获得什么优势?到目前为止,我更喜欢 DF。
    • 我从 RGD 得到什么好处? -- 不明白你的意思。它是一个定义组类型和操作的类。
    • 哦,好吧,我们似乎时不时会看到 i2i。这里不是,我认为 DF 在实践中要方便得多。干杯,我确实支持你。
    • 非常感谢。我不一定不同意... :)) 只是说 DS 中的列名具有完全不同的含义——它们是静态类型对象的属性与 DF 行中的“列标题”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 2018-04-08
    相关资源
    最近更新 更多