我想在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
中编写相同的内容
答案 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]|
+---+-----+-----------+
一些观察
我认为问题不是SQL,而是在创建DataFrame的早期步骤中。