PIVOT 如何将 Dataframe api 转换为 Spark SQL

问题描述 投票:0回答:1

在将 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 子句作为单个标记来获得预期的输出,但我希望使用数据透视表。

apache-spark pyspark apache-spark-sql databricks
1个回答
0
投票

你就快到了。您需要创建一个具有相同值但具有新名称的列。

这是一个例子

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|
+----+----+----+----+----+
© www.soinside.com 2019 - 2024. All rights reserved.