sparksql- collect\u set and sort\u array对整数列的排序不正确

mhd8tkvw  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(542)

我想在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

yh2wf1be

yh2wf1be1#

我用apachespark2.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,4561234]
当有字符串值时,spark抛出错误“typeerror:cannotmerge type longtype and stringtype”
我认为问题不在于sql,而是在创建dataframe的早期步骤中。

相关问题