SparkSQL - collect_set和sort_array没有正确排序整数列

时间:2016-10-21 11:05:37

标签: apache-spark pyspark apache-spark-sql hiveql

我想在SparkSQL中生成一个已排序的收集集,如下所示:

spark.sql("SELECT id, col_2, sort_array(collect_set(value)) AS collected
           FROM my_table GROUP BY id, col_2").show()

其中 value integer

但是它无法按正确的数字顺序对数组进行排序 - 并且做了一些特别的事情(在值的第一个数字的开头排序?是对字符串进行sort_array操作吗?)。

所以而不是:

+----+-------+------------+                                              
| id | col_2 | collected  |
+----+-------+------------+
| 1  |   2   |  [456,1234]|
+----+-------+------------+  

我明白了:

+----+-------+------------+                                              
| id | col_2 | collected  |
+----+-------+------------+
| 1  |   2   |  [1234,456]|
+----+-------+------------+  

修改

查看spark.sql(…)返回的内容显然是此查询返回字符串:

DataFrame[id: string, col_2: string, collected: array<string>]

当原始数据帧全部为integers时,该怎么办?

编辑2:

这似乎是与pyspark相关的问题,因为我没有遇到spark-shell的问题并在scala中编写相同的内容

1 个答案:

答案 0 :(得分:1)

我使用Apache Spark 2.0.0进行了测试。

它对我有用。确保我使用数据[(1, 2, 1234), (1, 2, 456)][(1, 2, 456), (1, 2, 1234)]进行了测试。结果是一样的。

from pyspark import SparkContext
from pyspark.sql import SQLContext

sc = SparkContext()
sqlContext = SQLContext(sc)

df = sqlContext.createDataFrame([(1, 2, 1234), (1, 2, 456)], ['id', 'col_2', 'value'])
# test with reversed order, too
#df = sqlContext.createDataFrame([(1, 2, 456), (1, 2, 1234)], ['id', 'col_2', 'value'])
df.createOrReplaceTempView("my_table")


sqlContext.sql("SELECT id, col_2, sort_array(collect_set(value)) AS collected FROM my_table GROUP BY id, col_2").show()

结果

+---+-----+-----------+
| id|col_2|  collected|
+---+-----+-----------+
|  1|    2|[456, 1234]|
+---+-----+-----------+

一些观察

  • 当值为None时,它显示为null,例如[null,456,1234]
  • 当有字符串值时,Spark抛出错误“TypeError:无法合并类型LongType和StringType”

我认为问题不是SQL,而是在创建DataFrame的早期步骤中。