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 数据框?

有没有办法“合并”两列,其中新列的值是具有特定值的原始列的名称,分组明智?

在包含记录的现有表中,如何创建一个新的 datetime2(2) 列并使用基于另一列的值填充它?