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

llmtgqce  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(374)

我读了很多关于hive、explode、横向视图和Map中的pivot表的stackoverflow解决方案,但我仍然可以´无法为我的问题找到简单的解决方案来创建配置单元查询。
所以,我想创建一个包含key、date和其他列的配置单元表。
其他列需要使用原始配置单元表(input)中特定列的值来创建。
最好举个例子:
输入:

所需的输出需要如下:

如我们所见,如果我们在列中有更多的元素(cat,dog,bird,snake…),那么输出列将产生4x3,在本例中为3(cat,dog,bird)x3(number,cost and ratio)
我认为我想到的唯一方法是使用大量的“case-when语句”,或者使用spark/scala进行尝试。
拜托!对Hive有什么建议吗?非常感谢!

j7dteeu8

j7dteeu81#

这是带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函数,我使用它是因为它可以解决我的规范。

相关问题