HIVE: создайте новую таблицу с n столбцами, используя n значений определенного столбца из исходной таблицы - PullRequest
0 голосов
/ 30 января 2019

Я прочитал множество решений для работы со стековым потоком, касающихся сводных таблиц в кустах, разнесениях, боковых видах и сопоставлениях, но я все еще не могу найти простое решение для моей задачи по созданию запроса улья.

Итак,Я хочу создать таблицу кустов с KEY, DATE и другими столбцами.

Другие столбцы необходимо создавать, используя значения определенного столбца из исходной таблицы кустов (INPUT).

Лучше с примером:

INPUT:

enter image description here

И желаемая выгода должна быть следующей:

enter image description here

Как мы видим, если в столбце COLUMN (CAT, DOG, BIRD, SNAKE ...) будет больше элементов, выходные столбцы приведут к 4x3, в этом примере3 (CAT, DOG, BIRD) x3 (ЧИСЛО, СТОИМОСТЬ И СООТНОШЕНИЕ)

Я думаю, что единственный подход, который я имею в виду, - это использовать много «случаев, когда высказывания», или пробовать это с помощью spark /Скала.

Пожалуйста!Любой совет по этому поводу улей?Очень ценится!

1 Ответ

0 голосов
/ 31 января 2019

Вот решение с 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, я использовал ее, потому что она может решить мои спецификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...