Секционированная таблица OR C отображается пустой в Hive - PullRequest
1 голос
/ 28 марта 2020

Я написал фрейм данных Spark для секционированных ORC файлов, таких как:

df.repartition("LOADED")\
  .write\
  .partitionBy("LOADED")\
  .format("orc")\
  .save("location")

Все на диске правильно. После этого я хотел создать из нее таблицу Hive, например:

CREATE TABLE table USING ORC LOCATION 'location'

Команда выполняется без ошибок. Но если я попытаюсь сделать запрос к таблице, она будет пустой.

Я попытался сделать то же самое без разбиения на разделы, и он работает просто отлично. Что я делаю неправильно? Разделенные папки выглядят следующим образом: LOADED=2019-11-16

Для справки: я хочу записать данные в Azure Blob Storage и создать из него таблицу Hive в другом кластере.

Ответы [ 2 ]

2 голосов
/ 28 марта 2020

Вам просто нужно обновить информацию о разделах в таблице, чтобы Hive мог перечислить имеющиеся разделы. Это делается с помощью команды MSCK REPAIR:

spark.sql("MSCK REPAIR TABLE <tableName>")

Подробнее об этой команде здесь

Быстрый пример здесь

scala> spark.sql("select * from table").show
20/03/28 17:12:46 WARN ObjectStore: Failed to get database global_temp, returning NoSuchObjectException
+------+------+
|column|LOADED|
+------+------+
+------+------+

scala> spark.sql("MSCK REPAIR TABLE table")


scala> spark.sql("select * from table").show
+------+----------+
|column|    LOADED|
+------+----------+
|     a|2019-11-16|
|     c|2019-11-16|
|     b|2019-11-17|
+------+----------+
2 голосов
/ 28 марта 2020

Вы пишете данные непосредственно в location не через операторы hiveQL, в этом случае нам нужно обновить метаданные таблицы улья из hive / spark, используя:

msck repair table <db_name>.<table_name>;

(или)

alter table <db_name>.<table_name> add partition(`LOADED`='<value>') location '<location_of the specific partition>';

Затем выполните приведенную ниже команду, чтобы вывести разделы из таблицы:

show partitions <db_name>.<table_name>;
...