【问题标题】:Flatten data in a spark sql query - Spark Dataframe在 spark sql 查询中展平数据 - Spark Dataframe
【发布时间】:2017-07-19 22:16:42
【问题描述】:

我正在尝试获取表中列的唯一值并将其与其他列一起打印,例如 sum、tablename,如下面的查询所示。 下面显示的子查询正在获取有效的多行,但为了将其放入列中,我需要将其展平为列表或文本,例如 [1,2,1]。如何将这些数据展平以适合相同的查询,如下所示。我的首选方法是使用 Spark SQL。请帮忙。

    **Subquery**

    (select distinct $field from tablename) 

    **Actual Code** 

    RDDdf.createOrReplaceTempView(“tablename”)

    val x=  RDDdf.schema.fieldNames

    val dfs = x.map(field => spark.sql(s"select 'RDDdf' as TableName, 
   '$field'as column, sum($field) as Sum, (select distinct $field from 
    tablename) from tablename"))

    **Expected output**

    TableName | column  | Sum | UniqueVal
    ----------+---------+-----+----------
    RDDdf     | a       | 4   | 1,2,1

【问题讨论】:

    标签: scala apache-spark apache-spark-sql spark-streaming spark-dataframe


    【解决方案1】:

    使用内置函数collect_list:

    select collect_list(value) from (select distinct($field) as value from tablename) as values
    

    请注意,这在大型数据集上会非常慢

    【讨论】:

    • 再次感谢 T.Gaweda !数据集将是巨大的,有数百万行......还有其他方法可以写同样的东西吗?
    • @sabby 问题是所有数据都将被收集到一个节点。没有其他选择可以进行此类查询。 collect_list 是一个很好的功能,只是您的用例会使其变慢,因为除了在一个节点上收集之外,没有其他选择可以在一行中显示所有值
    • 问题是当你有许多不同的字段值时 - 如果你有数百万行,但只有几个唯一值,那么在一个节点上收集数据就不会有问题:)
    • 我了解 T. Gaweda,不过我还没有在 S3 数据上对其进行测试,不确定数据会是什么样子......我们正在从 Panda 迁移。再次感谢您的帮助.. 一天两次 :)
    猜你喜欢
    • 2019-09-10
    • 1970-01-01
    • 2016-09-25
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2019-04-06
    相关资源
    最近更新 更多