开发者社区> 问答> 正文

如何有效地将DataFrame转换为(列名称 - >列值列表)的Map

我想要实现的是,对于以下DataFrame:


| FOO | BAR | BAZ |
| lorem | ipsum | dolor |
| sit | amet | dolor |

| lorem | lorem | dolor |

生成以下输出:

Map(
FOO -> List("lorem", "sit"),
BAR -> List("ipsum", "amet", "lorem"),
BAZ -> List("dolor")
)
这是我提出的Scala代码:

val df = data.distinct

df.columns.map((key) => {
val distinctValues = df

.select(col(key))
.collect
.map(df => df.getString(0))
.toList
.distinct

(key, distinctValues)
}).toMap
我已尝试使用RDD替代此代码,但不知何故,它们的速度提高了约30%,但问题仍然存在:这一切都非常低效。

我在本地运行Spark对抗一个只有1000行的样本数据集的本地Cassandra,但是这些操作会生成大量的日志,需要7秒多才能完成。

我做错了什么,有没有更好的方法呢?

展开
收起
社区小助手 2018-12-19 17:15:32 5276 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    识别列的唯一值

    for (x<- df.columns)
    {
    df.select(x).groupBy(x).count
    }
    我认为使用近似不同会使这更快。

    import org.apache.spark.sql.functions.approx_count_distinct
    df.agg(approx_count_distinct("some_column"))


    你有一个名为collect_set的函数

    df.select(collect_set($"FOO"), collect_set($"BAR"), collect_set($"BAZ"))

    2019-07-17 23:23:05
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载