我想在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
.
但它无法按正确的数字顺序对数组进行排序,并且做了一些非常特别的事情(而是在值中第一个数字的开头排序?排序数组是否在字符串上运行?)。
所以不是:
+----+-------+------------+
| 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>]
当原始的Dataframe都是 integers
.
编辑2:
这似乎是一个与 pyspark
,因为我没有遇到 spark-shell
写同样的东西 scala
1条答案
按热度按时间yh2wf1be1#
我用apachespark2.0.0进行了测试。
这对我很有用。确保我用数据测试过
[(1, 2, 1234), (1, 2, 456)]
以及[(1, 2, 456), (1, 2, 1234)]
. 结果是一样的。结果
一些观察
当一个值为none时,它显示为null,例如[null,4561234]
当有字符串值时,spark抛出错误“typeerror:cannotmerge type longtype and stringtype”
我认为问题不在于sql,而是在创建dataframe的早期步骤中。