HIVE:使用原始表中特定列的n值创建一个包含n列的新表

时间:2019-01-30 09:10:38

标签: sql hive pivot hiveql transformation

我阅读了很多有关配置单元,爆炸,侧面视图和映射中的数据透视表的stackoverflow解决方案,但是对于创建配置单元查询的问题,我仍然找不到简单的解决方案。

因此,我想用KEY,DATE和其他列创建一个配置单元表。

需要使用原始配置单元表(INPUT)中特定列的值来创建其他列。

一个更好的例子:

输入:

enter image description here

所需的输出需要遵循以下条件:

enter image description here

我们可以看到,如果我们在COLUMN中有更多元素(CAT,DOG,BIRD,SNAKE ...),则输出列将为4x3,在本示例中为3(CAT,DOG,BIRD)x3(NUMBER,费用和比率)

我认为我唯一想到的方法是使用很多“ case when statement”,或尝试使用spark / scala。

请!关于蜂巢对此有什么建议吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

这是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函数,因为它可以解决我的要求,所以我使用了它。