使用Scala为多个单个记录文件在Hive中加载数据的最佳方法

时间:2018-10-08 03:10:12

标签: scala apache-spark hive hdfs

我从源头获得了多个文件,其中每个文件都包含单个记录详细信息的格式。例如

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

我有10000个这样的文件。我正在通过Scala代码中的循环分别读取每个文件,从每个文件中提取fieldnamevalue并存储在Spark dataframe中。然后,我在Spark DF中进行必要的转换,并将DF存储在hive表中。 问题在于该方法花费的时间太长,无法将数据加载到Hive中。问题可能是因为每个文件都被单独打开并得到处理。还有其他加快流程的方法吗?

2 个答案:

答案 0 :(得分:0)

尝试一下

  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")

让我知道怎么回事。

答案 1 :(得分:0)

您可以尝试将所有数据文件存储在单个文件夹位置,并在这些文件之上构建external HIVE table。假设它是CSV文件,并且所有10,000个文件都具有相同的结构,那么构建一个外部配置单元表将对您的查询有所帮助。

在您的外部表中;您可以使用tblproperties忽略标题,如下所示:

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")

在此阶段,您将拥有一个包含所有数据集的表(未格式化)。您以后可以在外部表的顶部创建另一个表或视图,在其中可以根据需要设置数据格式。蜂巢中有多种功能可以实现所需的输出。

希望这会有所帮助:)

注意:此解决方案不使用spark。