数据没有通过SPARK以目标oracle表的排序格式写入

时间:2018-05-30 10:35:22

标签: apache-spark pyspark apache-spark-sql

我在hive中有一个带有以下架构的表 EMP_ID:INT EMP_NAME:字符串

我已经从上面的hive表

创建了数据框
df = sql_context.sql('SELECT * FROM employee ORDER by emp_id')
df.show()

运行上面的代码后,我看到数据在emp_id上正确排序

我正在尝试通过以下代码将数据写入Oracle表

df.write.jdbc(url=url, table='target_table', properties=properties,  mode="overwrite")

根据我的理解,这是因为多个执行程序进程在每个数据分区上同时运行,并且通过查询应用的排序已应用于特定分区,并且当多个进程同时向Oracle写入数据时表排序失真

我进一步尝试将数据重新分区到一个分区(这不是理想的解决方案)并将数据写入oracle,排序正常工作

有没有办法从SPARK

将分类数据写入RDBMS

1 个答案:

答案 0 :(得分:1)

TL; DR 使用关系系统时,不应该依赖于插入顺序。 Spark在这里并不重要。

关系数据库(包括Oracle)不保证存储数据的任何内在顺序。存储记录的确切顺序是实现的细节,并且可以在数据的生命周期内发生变化。

Oracle中唯一的例外是Index Organized Tables,其中:

  

索引组织表的数据以主键排序方式存储在B树索引结构中。

这当然需要一个可以可靠地确定顺序的主键。