在将 dataframe api 转换为 Spark SQL 时,我得到了不同的输出。指出我错过了 sql 逻辑的地方。
我有一个名为 demo 的表,有两列值和标记。值列是从 1 到 100 开始的序列号。标记值是 A [1 到 10] 、 B [11-20] 等等。
样本表
+-----+------+
|value|marker|
+-----+------+
| 1| A|
| 2| A|
| 3| A|
| 4| A|
| 5| A|
| 6| A|
| 7| A|
| 8| A|
| 9| A|
| 10| A|
| 11| B|
| 12| B|
DataFrame API 和输出。
df_2.groupBy('marker').pivot('marker').agg(F.count('*')).fillna(0).show()
输出:
+------+---+---+---+---+---+---+---+---+---+---+
|marker| A| B| C| D| E| F| G| H| I| J|
+------+---+---+---+---+---+---+---+---+---+---+
| B| 0| 10| 0| 0| 0| 0| 0| 0| 0| 0|
| A| 10| 0| 0| 0| 0| 0| 0| 0| 0| 0|
| C| 0| 0| 10| 0| 0| 0| 0| 0| 0| 0|
| D| 0| 0| 0| 10| 0| 0| 0| 0| 0| 0|
| E| 0| 0| 0| 0| 10| 0| 0| 0| 0| 0|
| F| 0| 0| 0| 0| 0| 10| 0| 0| 0| 0|
| G| 0| 0| 0| 0| 0| 0| 10| 0| 0| 0|
| H| 0| 0| 0| 0| 0| 0| 0| 10| 0| 0|
| I| 0| 0| 0| 0| 0| 0| 0| 0| 10| 0|
| J| 0| 0| 0| 0| 0| 0| 0| 0| 0| 9|
+------+---+---+---+---+---+---+---+---+---+---+
我尝试使用 PIVOT 将 API 转换为基于 SQL,如下所示。
spark.sql("""
select
*
from
(
select marker from demo
)
PIVOT
(
count(marker)
for marker in ('A','B','C','D','E','F','G','H','I','J')
)
""").show()
输出为
+---+---+---+---+---+---+---+---+---+---+
| A| B| C| D| E| F| G| H| I| J|
+---+---+---+---+---+---+---+---+---+---+
| 10| 10| 10| 10| 10| 10| 10| 10| 10| 9|
+---+---+---+---+---+---+---+---+---+---+
如何使用 Spark SQL 获取 Dataframe API 输出。
注意 - 我们可以使用 sum 和 case when 子句作为单个标记来获得预期的输出,但我希望使用数据透视表。
你就快到了。您需要创建一个具有相同值但具有新名称的列。
这是一个例子
select * from (
select col, col as col1 from data_tbl
)
pivot (
count(col) for col in ('A', 'B', 'C', 'D')
)
order by col1
这会导致
+----+----+----+----+----+
|col1| A| B| C| D|
+----+----+----+----+----+
| A| 10|null|null|null|
| B|null| 10|null|null|
| C|null|null| 10|null|
| D|null|null|null| 10|
+----+----+----+----+----+