Создать таблицу Hive поверх данных, созданных в Spark

Я создал данные в формате ORC в Spark следующим образом:

var select: String = "SELECT ..."
sqlContext.sql(select).write.format("orc").save("/tmp/out/20160101")
select = "SELECT ..."
sqlContext.sql(select).write.format("orc").save("/tmp/out/20160102")
& so on...

Теперь я пытаюсь создать внешнюю таблицу в Hive следующим образом:

CREATE EXTERNAL TABLE `mydb.mytable`
 (`col1` string, 
  `col2` decimal(38,0), 
  `create_date` timestamp, 
  `update_date` timestamp)
  PARTITIONED BY (`my_date` string)
  STORED AS ORC
  LOCATION '/tmp/out/';

Когда я делаю:

"select count(*) from mydb.mytable"

Я получаю значение count как 0. Но в Spark-shell, когда я запускаю:

val results = sqlContext.read.format("orc").load("/tmp/out/*/part*")
results.registerTempTable("results")
sqlContext.sql("select count(*) from results").show

Как и ожидалось, я получаю 500 000 строк.

Похоже, что «Разделы» не распознаются или что-то в этом роде. Как я могу создать «внешнюю» таблицу Hive поверх данных, созданных в Spark?


person DilTeam    schedule 08.12.2016    source источник
comment
вы говорите улью найти данные в /tmp/out/my_date=<date>, но в искре вы сохраняете в /tmp/out/<date>   -  person puhlen    schedule 08.12.2016
comment
Хм ... Как я могу указать Hive, чтобы он смотрел на / tmp / out / ‹date›, а не на / tmp / out / my_date = ‹date›? Я бы предпочел не менять место вывода.   -  person DilTeam    schedule 08.12.2016
comment
Насколько я знаю, нет. <column_name>=<value> - это формат имен каталогов разделов куста. Измените мощность искры, чтобы она соответствовала этому.   -  person puhlen    schedule 09.12.2016


Ответы (1)


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

Вы можете использовать запрос ALTER TABLE для создания нового раздела в хранилище метаданных.

ALTER TABLE mydb.mytable 
ADD PARTITION (my_date='20160101')
LOCATION '/tmp/out/20160101'

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

Однако Hive имеет стандартное соглашение об именах для своих разделов <column_name>=<value>. Использование этой схемы именования имеет несколько преимуществ. Во-первых, вы можете опустить предложение LOCATION в запросе ALTER TABLE, но это также позволит вам вместо этого использовать другой запрос: MSCK REPAIR TABLE <table_name>, который добавит все каталоги как разделы в хранилище метаданных. Это полезно, если вы хотите добавить сразу несколько разделов, и означает, что вам не нужно знать значения всех столбцов раздела, которые вы добавляете.

person puhlen    schedule 08.12.2016
comment
Неа. / tmp / out / my_date = 20160101 у меня не работает. Я постараюсь ИЗМЕНИТЬ ТАБЛИЦУ и посмотреть. - person DilTeam; 09.12.2016
comment
Это сработало: ALTER TABLE mydb.mytable ADD PARTITION (my_date = 20160101) LOCATION '/ tmp / out / 20160101'; Пожалуйста, исправьте опечатку в своем ответе. Спасибо. - person DilTeam; 09.12.2016
comment
На самом деле, установка `(галочки) вокруг даты не работала, но my_date = 20160101 работала. YMMV. - person DilTeam; 09.12.2016
comment
Извините, я неправильно понял, как работает улей. Я добавил в свой ответ дополнительную информацию. - person puhlen; 09.12.2016