动态 Pivot/Transpose 行到 Hive/Spark 中的列
Dynamically Pivot/Transpose Rows to Columns in Hive/Spark
我有季度基础数据,并且数据随着季度增长而不断动态增长-
qtr dimvalue percentage
FY2019-Q1 XYZ 15
FY2019-Q1 ABC 80
FY2019-Q1 PPP 5
FY2019-Q2 XYZ 10
FY2019-Q2 ABC 70
FY2019-Q2 PPP 20
当季度数较少时,我每次都手动编辑查询并尝试如下查询来转置它-
SELECT dim_value,SUM(Quater_1) as Quater_1,SUM(Quater_2) as Quater_2 from
(
SELECT dim_value,
CASE WHEN qtr='FY2019-Q1' THEN percentage END AS Quater_1,
CASE WHEN qtr='FY2019-Q2' THEN percentage END AS Quater_2 FROM
( select * from schema.table where qtr in ('FY2019-Q1','FY2019-Q2'))t2 order by dim_value
)t1 group by dim_value;
dimvalue Quater_1 Quater_2
XYZ 15 10
ABC 80 70
PPP 5 20
但我的问题是我如何以动态方式和更稳健的方式激活它以将行转置为列并牢记不断增长的四分之一并随着四分之一的增长具有适当的四分之一列名称。
总而言之,我正在寻找如何使用更动态的查询来执行此操作,无论是使用 Hive 还是 Spark-SQL 或者是否有任何建议来执行它?
感谢您的帮助
如果可行的话,您可以使用数据集 API 轻松地进行这种转换。
spark.table("schema.table").groupBy("dimvalue").pivot("qtr").sum("percentage").show
+--------+---------+---------+
|dimvalue|FY2019-Q1|FY2019-Q2|
+--------+---------+---------+
| PPP| 5| 20|
| XYZ| 15| 10|
| ABC| 80| 70|
+--------+---------+---------+
使用 SQL 唯一的方法是动态构建它。
我有季度基础数据,并且数据随着季度增长而不断动态增长-
qtr dimvalue percentage
FY2019-Q1 XYZ 15
FY2019-Q1 ABC 80
FY2019-Q1 PPP 5
FY2019-Q2 XYZ 10
FY2019-Q2 ABC 70
FY2019-Q2 PPP 20
当季度数较少时,我每次都手动编辑查询并尝试如下查询来转置它-
SELECT dim_value,SUM(Quater_1) as Quater_1,SUM(Quater_2) as Quater_2 from
(
SELECT dim_value,
CASE WHEN qtr='FY2019-Q1' THEN percentage END AS Quater_1,
CASE WHEN qtr='FY2019-Q2' THEN percentage END AS Quater_2 FROM
( select * from schema.table where qtr in ('FY2019-Q1','FY2019-Q2'))t2 order by dim_value
)t1 group by dim_value;
dimvalue Quater_1 Quater_2
XYZ 15 10
ABC 80 70
PPP 5 20
但我的问题是我如何以动态方式和更稳健的方式激活它以将行转置为列并牢记不断增长的四分之一并随着四分之一的增长具有适当的四分之一列名称。
总而言之,我正在寻找如何使用更动态的查询来执行此操作,无论是使用 Hive 还是 Spark-SQL 或者是否有任何建议来执行它?
感谢您的帮助
如果可行的话,您可以使用数据集 API 轻松地进行这种转换。
spark.table("schema.table").groupBy("dimvalue").pivot("qtr").sum("percentage").show
+--------+---------+---------+
|dimvalue|FY2019-Q1|FY2019-Q2|
+--------+---------+---------+
| PPP| 5| 20|
| XYZ| 15| 10|
| ABC| 80| 70|
+--------+---------+---------+
使用 SQL 唯一的方法是动态构建它。