Лучший подход для загрузки данных в Hive с использованием Scala для нескольких отдельных файлов записей - PullRequest
0 голосов
/ 08 октября 2018

У меня есть несколько файлов из источника, где каждый файл содержит отдельные записи в формате.Например,

Cust ID: 123,Cust name: XYZ, Some notes to be ignored, E-mail: XYZ@avdg.com

У меня есть 10000 таких файлов.Я читаю каждый из этих файлов по отдельности через цикл в коде Scala, извлекая fieldname и value из каждого файла и сохраняя в Spark dataframe.Затем я делаю необходимые преобразования в Spark DF и сохраняю DF в таблице hive.Проблема в том, что для загрузки данных в Hive требуется слишком много времени.Возможно, проблема в том, что каждый файл открывается индивидуально и обрабатывается.Есть ли другой способ ускорить процесс?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

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

Во внешней таблице;вы можете игнорировать заголовки, используя свойства tbl, как показано ниже:

CREATE EXTERNAL TABLE <tableName>(
  col1 string,
  col2 int
  ....
)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ','
LOCATION '<hdfs location of your files>'
tblproperties ("skip.header.line.count"="1")

На данном этапе у вас будет таблица со всем вашим набором данных (неформатированная).Позже вы можете создать другую таблицу или представления поверх вашей внешней таблицы, где вы можете отформатировать данные в соответствии с требованиями.В улье есть несколько функций для достижения желаемого результата.

Надеюсь, это поможет:)

Примечание. В этом решении не используется искра.

0 голосов
/ 09 октября 2018

Попробуйте это

  1. Считайте все необходимые файлы и сохраните их в кадре данных.
  2. Объедините / объедините отдельные кадры данных в один кадр данных.
  3. Повторное объединение данных в кадре.
  4. Сохранить перераспределенный фрейм данных в таблицу Hive.

Считать все файлы и сохранить их в фреймы

val dfs = Seq('file1','file2').map { i =>
df = spark.read.format("csv").option("header", "true").load(s"${'"'}$i${'"'})
}

Сократить фреймы данных в один

val unionDF = dfs.reduceLeft((dfa, dfb) => 
  dfa.unionAll(dfb)
)

Перераспределение объединенного фрейма данных.

unionDF.coalesce(10)

Запись в таблицу кустов

unionDF.write().mode("overwrite").saveAsTable("database.table")

Дайте мне знать, как это происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...