Структурированная потоковая передача Spark Writestream в Hive Разделенная на внешние таблицы таблица ORC

Я пытаюсь использовать Spark Structured Streaming - writeStream API для записи во внешнюю секционированную таблицу Hive.

CREATE EXTERNAL TABLE `XX`(
`a` string,
`b` string,
`b` string,
`happened` timestamp,
`processed` timestamp,
`d` string,
`e` string,
`f` string )
 PARTITIONED BY (
`year` int, `month` int, `day` int)      
 CLUSTERED BY (d)
INTO 6 BUCKETS
STORED AS ORC 
TBLPROPERTIES (
'orc.compress'='ZLIB',
'orc.compression.strategy'='SPEED',
'orc.create.index'='true',
'orc.encoding.strategy'='SPEED');

и в коде Spark,

val hiveOrcWriter:   DataStreamWriter[Row] = event_stream
  .writeStream
  .outputMode("append")
  .format("orc")
  .partitionBy("year","month","day")
  //.option("compression", "zlib")
  .option("path", _table_loc)
  .option("checkpointLocation", _table_checkpoint)

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

Цените комментарии от любого, кто имел дело с подобными проблемами.

Редактировать:

Только что обнаружил, что файлы.orc действительно записаны в HDFS с правильной структурой каталогов разделов: например. /_table_loc/_table_name/year/month/day/part-0000-0123123.c000.snappy.orc

тем не мение

select * from 'XX' limit 1; (or where year=2018)

не возвращает строк

InputFormat а также OutputFormat для таблицы "XX" org.apache.hadoop.hive.ql.io.orc.OrcInputFormat а также org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat соответственно.

1 ответ

Эта функция не предоставляется из коробки при структурированной потоковой передаче. При обычной обработке вы бы использовали dataset.write.saveAsTable(table_name) и этот метод недоступен.

После обработки и сохранения данных в HDFS вы можете вручную обновить разделы (или использовать скрипт, который делает это по расписанию):

Если вы используете Hive

MSCK REPAIR TABLE table_name

Если вы используете Impala

ALTER TABLE table_name RECOVER PARTITIONS
Другие вопросы по тегам