#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 выполняйте работу, спасибо