我从源头获得了多个文件,其中每个文件都包含单个记录详细信息的格式。例如
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中。问题可能是因为每个文件都被单独打开并得到处理。还有其他加快流程的方法吗?
答案 0 :(得分:0)
尝试一下
读取所有文件并存储到数据框中
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。