Создать таблицу-улей на разделенном по годам, месяцам и дням паркете

#scala #apache-spark #hive #hdfs

#scala #apache-spark #улей #hdfs

Вопрос:

Я создаю фрейм данных следующим образом:

 val df = Seq(
  (1,27,"bob",2020,9,3),
  (1,27,"jack",2020,9,3),
  (3,31,"tom",2020,9,4)
).toDF("id","age","nom","year","month","day")
  

Я получаю следующий фрейм данных

  --- --- ---- ---- ----- --- 
|id |age|nom |year|month|day|
 --- --- ---- ---- ----- --- 
|1  |27 |bob |2020|9    |3  |
|1  |27 |jack|2020|9    |3  |
|3  |31 |tom |2020|9    |4  |
 --- --- ---- ---- ----- --- 
  

затем я пишу df в hdfs с разделением по usig год, месяц, день;

 df.write
  .mode(SaveMode.Append)
  .partitionBy("year", "month", "day")
  .parquet(s"$outputPath/test_hive")
  

Я получаю данные по следующим путям hdfs:

  • /outputPath/test_hive/year=2020/month=9/day=3
  • /outputPath/test_hive/year=2020/month=9/day=4

Интересно, как я могу создать внешнюю таблицу улья в location outputPath/test_hive , которая могла бы учитывать подкаталоги year, month и day.

Я попытался создать следующую таблицу, но она не работает:

 CREATE EXTERNAL TABLE test1(id int, age int, nom string, year int, month int, day int) STORED AS PARQUET LOCATION 'outputPath/test_hive'

 ----------- ------------ ------------ -- 
| test1.id  | test1.age  | test1.nom  |
 ----------- ------------ ------------ -- 
| 1         | 27         | bob        |
| 1         | 27         | jack       |
| 3         | 31         | tom        |
 ----------- ------------ ------------ -- 
  

и

 CREATE EXTERNAL TABLE test2(id int, age int, nom string) PARTITIONED BY(year INT, month int , day INT) STORED AS PARQUET LOCATION 'outputPath/test_hive'

 ----------- ------------ ------------ ------------- -------------- ------------ -- 
| test2.id  | test2.age  | test2.nom  | test2.year  | test2.month  | test2.day  |
 ----------- ------------ ------------ ------------- -------------- ------------ -- 
 ----------- ------------ ------------ ------------- -------------- ------------ -- 
  

и

 CREATE EXTERNAL TABLE test3(id int, age int, nom string) STORED AS PARQUET LOCATION 'outputPath/test_hive' PARTITIONED BY(year INT, month int , day INT);

Error while compiling statement: FAILED: ParseException line 1:138 missing EOF at 'PARTITIONED' near ''/outputPath/test_hive'' (state=42000,code=40000)
  

Комментарии:

1. как насчет изменения stored as и partitioned by порядка второго?

2. @Lamanus Я попытался изменить порядок, как вы упомянули, с третьим, который я только что отредактировал, но я получаю ошибку: Ошибка при компиляции инструкции: СБОЙ: строка ParseException 1: 138 отсутствует EOF в ‘PARTITIONED’ рядом с «/ OutputPath /test_hive» (состояние = 42000, код = 40000)

3. какие ошибки возникают для первых двух?

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

Ответ №1:

Сделайте msck repair table or add partitions с таблицей.

Example:

From Hive:

 hive> msck repair table test3

--or

hive> ALTER TABLE test3 ADD PARTITION (year='2020', month='9',day='3') location '/outputPath/test_hive/year=2020/month=9/day=3';
  

From spark:

 spark.sql("ALTER TABLE test3 ADD PARTITION (year='2020', month='9',day='3') location '/outputPath/test_hive/year=2020/month=9/day=3'")

//or

spark.sql("msck repair table test3")
  

Комментарии:

1. msck repair table test2 после каждого обновления данных hdfs выполняйте работу, спасибо