HIVE:使用原始表中特定列的 n 值创建一个包含 n 列的新表
Posted
技术标签:
【中文标题】HIVE:使用原始表中特定列的 n 值创建一个包含 n 列的新表【英文标题】:HIVE: create a new table with n columns using the n values of a specific column from the original table 【发布时间】:2019-01-30 09:10:38 【问题描述】:我阅读了很多关于 hive、explode、横向视图和映射中的数据透视表的 *** 解决方案,但我仍然找不到一个简单的解决方案来解决我的问题来创建 hive 查询。
所以,我想创建一个包含 KEY、DATE 和其他列的配置单元表。
其他列需要使用原始 hive 表 (INPUT) 中特定列的值创建。
举个例子更好:
输入:
所需的输出需要如下:
如我们所见,如果我们在 COLUMN (CAT,DOG,BIRD,SNAKE...) 中有更多元素,则输出列将导致 4x3 ,在本例中为 3(CAT, DOG, BIRD)x3(NUMBER,成本和比例)
我认为我想到的唯一方法是使用大量“case when statements”,或者使用 spark/scala 尝试它。
请!对蜂巢有什么建议吗?非常感谢!
【问题讨论】:
你最好用 spark 来做这个。 是的,在此期间我将按此方式进行,谢谢! 【参考方案1】:这是 Spark 的解决方案,非常简单!
val originDf: DataFrame = Seq(
("A", "2015-01", "CAT", "30", "888.8", "1"),
("A", "2015-04", "CAT", "10", "14.3", "0.99"),
("A", "2015-11", "DOG", "6", "22.22", "0.65"),
("B", "2016-09", "BIRD", "1", "0.1", "0.11"))
.toDF("key", "date", "column", "number", "cost", "ratio")
.withColumn("column", lower(col("column")))
.withColumn("number", col("number").cast("double"))
.withColumn("cost", col("cost").cast("double"))
.withColumn("ratio", col("ratio").cast("double"))
val expectedDf: DataFrame = Seq(
("A", "2015-01", null, null, null, "30", "888.8", "1", null, null, null),
("A", "2015-04", null, null, null, "10", "14.3", "0.99", null, null, null),
("A", "2015-11", null, null, null, null, null, null, "6", "22.22", "0.65"),
("B", "2016-09", "1", "0.1", "0.11", null, null, null, null, null, null))
.toDF("key", "date", "bird_number", "bird_cost", "bird_ratio", "cat_number","cat_cost", "cat_ratio", "dog_number", "dog_cost", "dog_ratio")
.orderBy("key","date")
以及实现: 我建议使用测试类并使用 FlatSpect,以便您稍后测试您的真实功能。
val resultDf = originDf
.groupBy("key","date")
.pivot("column").max("number", "cost", "ratio")
.orderBy("key","date")
注意 max 函数,我使用它是因为它可以解决我的规范。
【讨论】:
以上是关于HIVE:使用原始表中特定列的 n 值创建一个包含 n 列的新表的主要内容,如果未能解决你的问题,请参考以下文章
Hive:无法在具有 100 个或更多分区列的表中插入数据错误:在最大长度为 767 的列“PART_NAME”中
如何将一个表中列的每个不同值映射到 Hive 中另一个表中列的每个不同值
Python:如何快速创建仅包含大型 Excel 工作表中特定列的 pandas 数据框?