我可以在sparksql中使用带有堆栈函数的横向视图吗?

laawzig2  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(337)

我想从宽表中取出一组列。我试着用下面的 SQL 引发错误的语法 Only one generator allowed per select clause but found 2. stack... ```
SELECT
Id,
STACK(2, 'TRANS1', TRANS1, 'TRANS2', TRANS2) AS (TRANS_TYPE, TRANS_VALUE),
STACK(2, 'ORD1', ORD1, 'ORD2', ORD2) AS (ORD_TYPE, ORD_VALUE)
FROM TRANS

所以我想看看是否有任何简单的替代方案来达到预期的效果。有没有可能使用 `LATERAL VIEW` 与 `STACK` sparksql中的函数?
现有数据集示例:

+-------+-------+-------+-------+-------+
|Id |TRANS1 |TRANS2 |ORD1 | ORD2 |
+-------+-------+-------+-------+-------+
|345 |10 |12 |1 |1.2 |
|769 |20 |24 |2 |2.4 |
+-------+-------+-------+-------+-------+

可以使用以下代码创建:

df = sqlCtx.createDataFrame(
[
(345, 10, 12, 1, 1.2),
(769, 20, 24, 2, 2.4)
],
('Id','TRANS1','TRANS2','ORD1','ORD2')
)

预期产量:

+-------+--------------+--------------+--------------+--------------+
|Id |TRANS_TYPE |TRANS_VALUE |ORD_TYPE |ORD_VALUE |
+-------+--------------+--------------+--------------+--------------+
|345 |TRANS1 |10 |ORD1 |1 |
|345 |TRANS2 |12 |ORD2 |1.2 |
|769 |TRANS1 |20 |ORD1 |2 |
|769 |TRANS2 |24 |ORD2 |2.4 |
+-------+--------------+--------------+--------------+--------------+

px9o7tmv

px9o7tmv1#

您可以将参数修改为 stack . 你可以替换 stringdouble / float 以确保列类型相同。

select 
    Id, 
    stack(2, 'trans1', string(trans1), 
             'ord1', string(ord1), 
             'trans2', string(trans2), 
             'ord2', string(ord2)
         ) as (TRANS_TYPE, TRANS_VALUE, ORD_TYPE, ORD_VALUE)
from trans

+---+----------+-----------+--------+---------+
| Id|TRANS_TYPE|TRANS_VALUE|ORD_TYPE|ORD_VALUE|
+---+----------+-----------+--------+---------+
|345|    trans1|         10|    ord1|        1|
|345|    trans2|         12|    ord2|      1.2|
|769|    trans1|         20|    ord1|        2|
|769|    trans2|         24|    ord2|      2.4|
+---+----------+-----------+--------+---------+

相关问题