我想要实现的是,对于以下DataFrame:
| FOO | BAR | BAZ |
| lorem | ipsum | dolor |
| sit | amet | 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秒多才能完成。
我做错了什么,有没有更好的方法呢?
识别列的唯一值
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"))
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。