SparkSQL动态分区报错

yarn.ApplicationMaster: User class threw exception: org.apache.spark.SparkException: Dynamic partition strict mode requires at least one static partition column. To turn this off set hive.exec.dynamic.partition.mode=nonstrict
org.apache.spark.SparkException: Dynamic partition strict mode requires at least one static partition column. To turn this off set hive.exec.dynamic.partition.mode=nonstrict
at org.apache.spark.sql.hive.execution.InsertIntoHiveTable.sideEffectResult$lzycompute(InsertIntoHiveTable.scala:269)
at org.apache.spark.sql.hive.execution.InsertIntoHiveTable.sideEffectResult(InsertIntoHiveTable.scala:221)
at org.apache.spark.sql.hive.execution.InsertIntoHiveTable.doExecute(InsertIntoHiveTable.scala:413)

增加代码:

hiveContext.sql("set hive.exec.dynamic.partition.mode=nonstrict")
Spark SQL 中的动态分区插入指的是根据查询结果动态地创建分区表中的分区。这在处理大规模数据时尤为重要,因为它允许你将数据高效地存储到具有适当分区的表中,进而可以优化后续的数据读取操作。然而,如果不进行适当的优化,动态分区插入可能会成为性能瓶颈。以下是一些优化动态分区插入的策略: 1. 启用并行执行:在 Spark SQL 中,可以通过设置 `spark.sql.shuffle.partitions` 属性来控制任务的并行度。根据集群资源合理设置分区数,以提高数据写入的并行性。 2. 数据倾斜优化:数据倾斜是导致动态分区插入效率低下的常见原因。可以通过增加分区数量、使用 salting 技术、或者对数据进行预处理等方法减少倾斜。 3. 适当配置动态分区插入参数:在执行动态分区插入时,可以通过 `spark.sql.sources.partitionOverwriteMode` 配置参数来指定分区覆盖模式。例如,使用 'dynamic' 模式可以只覆盖存在的分区,避免不必要的数据删除和重写操作。 4. 合理利用广播变量和持久化:对于小表或者需要频繁引用的静态数据,可以使用广播变量来优化跨节点的数据传递。同时,对于重复使用的大型数据集,合理使用持久化功能可以减少数据的重复读取和处理。 5. 控制事务大小:在使用 Spark SQL 进行动态分区插入时,可以控制事务的大小,通过减少每次插入的数据量来减少事务的开销。 6. 关闭检查点机制:Spark SQL 的检查点机制会增加额外的I/O操作,可以通过关闭检查点来减少不必要的性能开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值