Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在Spark中将多个小文件合并为几个较大的文件_Scala_Hadoop_Apache Spark_Hive_Apache Spark Sql - Fatal编程技术网

Scala 在Spark中将多个小文件合并为几个较大的文件

Scala 在Spark中将多个小文件合并为几个较大的文件,scala,hadoop,apache-spark,hive,apache-spark-sql,Scala,Hadoop,Apache Spark,Hive,Apache Spark Sql,我通过火花使用蜂箱。我的spark代码中有一个插入分区表查询。输入数据以200+gb为单位。当Spark写入分区表时,它会吐出非常小的文件(以kb为单位的文件)。因此,现在输出分区表文件夹有5000多个小kb文件。我想把这些合并到几个大MB的文件中,可能只有几个200mb左右的文件。我厌倦了使用配置单元合并设置,但它们似乎不起作用 'val result7A = hiveContext.sql("set hive.exec.dynamic.partition=true") val resul

我通过火花使用蜂箱。我的spark代码中有一个插入分区表查询。输入数据以200+gb为单位。当Spark写入分区表时,它会吐出非常小的文件(以kb为单位的文件)。因此,现在输出分区表文件夹有5000多个小kb文件。我想把这些合并到几个大MB的文件中,可能只有几个200mb左右的文件。我厌倦了使用配置单元合并设置,但它们似乎不起作用

'val result7A = hiveContext.sql("set hive.exec.dynamic.partition=true")

 val result7B = hiveContext.sql("set hive.exec.dynamic.partition.mode=nonstrict")

val result7C = hiveContext.sql("SET hive.merge.size.per.task=256000000")

val result7D = hiveContext.sql("SET hive.merge.mapfiles=true")

val result7E = hiveContext.sql("SET hive.merge.mapredfiles=true")

val result7F = hiveContext.sql("SET hive.merge.sparkfiles = true")

val result7G = hiveContext.sql("set hive.aux.jars.path=c:\\Applications\\json-serde-1.1.9.3-SNAPSHOT-jar-with-dependencies.jar")

val result8 = hiveContext.sql("INSERT INTO TABLE partition_table PARTITION (date) select a,b,c from partition_json_table")'

上述配置单元设置在mapreduce配置单元执行中工作,并输出指定大小的文件。是否有任何选项可以执行此Spark或Scala?

您可能希望尝试使用此方法;它返回一个具有指定数量分区的数据帧(每个分区在插入时都成为一个文件)。因此,使用插入的记录数和每条记录的典型大小,您可以估计要合并到大约200MB文件的分区数

我也有同样的问题。解决方案是在分区列中添加DISTRIBUTE BY子句。这确保了一个分区的数据进入到单个reducer。你的例子是:

INSERT INTO TABLE partition_table PARTITION (date) select a,b,c from partition_json_table DISTRIBUTE BY date

dataframe方法在这种情况下起作用

所以你现在每天都会收到很多文件,而你只需要几个?或者您想将多天合并到一个文件中?@maxymoo我每天在分区中得到许多小文件(kb文件),而我只需要几个大文件(MB)。您好@user3267086您能解决这个小文件问题吗?我试着使用hc.sql(“bla-bla”).coalesce(10)方法,但它不重要我仍然看到200个大约20mbhi@zweiterlinde的小文件我试着使用hc.sql(“bla-bla”).coalesce(10)方法,但它不重要我仍然看到200个大约20mbi的小文件需要更长的代码样本才能真正进行注释,但是在我的玩具实验中,调用
df.write.parquetFile(…)
生成了许多部件文件,但是
df.coalesce(1.write.parquetFile(…)
生成了一个。嘿@Jussi Kujala非常感谢这似乎对我有用。但我有一个问题,如果我的表被多个列分割会怎么样。。。在这种情况下,这也会起作用吗?