Apache spark 使用DataFrame.coalesce减少输出文件的数量

Apache spark 使用DataFrame.coalesce减少输出文件的数量,apache-spark,hive,apache-spark-sql,Apache Spark,Hive,Apache Spark Sql,当我使用Spark HiveContext执行sql(如insert overwrite a select*from b)时,最后,在HDFS表的相应目录中有许多小文件(400+),其中许多是空文件。因此,我尝试使用coalesce来减少文件数量,示例代码是: val df = hiveContext.sql("insert overwrite a select * from b") df.coalesce(50).collect 但是输出文件仍然是400+,看起来coalesce不起作用 有

当我使用Spark HiveContext执行sql(如
insert overwrite a select*from b
)时,最后,在HDFS表的相应目录中有许多小文件(400+),其中许多是空文件。因此,我尝试使用
coalesce
来减少文件数量,示例代码是:

val df = hiveContext.sql("insert overwrite a select * from b")
df.coalesce(50).collect
但是输出文件仍然是400+,看起来
coalesce
不起作用


有人能帮忙吗

您的示例不会合并输出文件,因为
合并
是在使用
insert-into
执行SQL之后完成的,并且在此
insert-into
结果上(我认为这是一个空数据帧)

尝试将代码重写为以下内容:

hiveContext.sql("select * from b").coalesce(50).write.mode("overwrite").saveAsTable("a")

您的示例不会合并输出文件,因为
合并
是在使用
insert-into
执行SQL之后完成的,并且在此
insert-into
结果上(我认为这是一个空数据帧)

尝试将代码重写为以下内容:

hiveContext.sql("select * from b").coalesce(50).write.mode("overwrite").saveAsTable("a")

您如何验证合并不起作用?因为我看到你在做一个收集后,这!collect用于触发作业。由于作业是一个插入操作,因此将“收集”到驱动程序的数据非常少。数据仍会写入HDFS!我无法理解合并只是一个洗牌转换,每一个动作都会被重新计算!你能在这里添加更多的插入代码吗?谢谢@ShivanshRivastava的回复。更多代码?我认为上面的代码足以说明问题。您想知道什么代码?代码中的“输出”(“输出文件400+”)应该是什么结果?您如何验证coalesce不起作用?因为我看到你在做一个收集后,这!collect用于触发作业。由于作业是一个插入操作,因此将“收集”到驱动程序的数据非常少。数据仍会写入HDFS!我无法理解合并只是一个洗牌转换,每一个动作都会被重新计算!你能在这里添加更多的插入代码吗?谢谢@ShivanshRivastava的回复。更多代码?我认为上面的代码足以说明这个问题..你想知道什么代码?代码中的什么应该是“输出”(“output files 400+”)的结果?谢谢@Marisz。一个简单的问题是如何为表a指定分区。也就是说,我想写入表a的一个分区。
DataFrameWriter
上有一个方法
partitionedBy
,但该方法文档看起来不像是使用配置单元分区。
partitionBy
在写入配置单元时按预期工作,我刚刚在spark 2.0 Hanks@Marisz上测试过。一个简单的问题是如何为表a指定分区。也就是说,我想写入表a的一个分区。
DataFrameWriter
上有一个方法
partitionedBy
,但该方法文档看起来不像是使用配置单元分区。
partitionBy
在写入配置单元时按预期工作,我刚刚在spark 2.0上进行了测试