我一直致力于基于pyspark的内容提取/同步工具(类似于sqoop,但将某些转换应用为管道)。我通过以下方式创建了一个jdbc连接:
datatype_boundry_mappings = {
# https://docs.microsoft.com/en-us/sql/t-sql/data-types/int-bigint-smallint-and-tinyint-transact-sql
# We are not not using negative numbers below 10 anywhere so our lower limit does not match the sqlserver range
'sqlserver': {
'tinyint': {
'lower': 0,
'upper': 255
},
'smallint': {
'lower': -10,
'upper': 32767
},
'int': {
'lower': -10,
'upper': 2147483647
},
'bigint': {
'lower': -10,
'upper': 9223372036854775807
}
}
}
(...)
jdbc_df = spark.read \
.format("jdbc") \
.option("url", jdbc_url) \
.option("dbtable", table_name) \
.option("user", db_username) \
.option("password", db_password) \
.option("numPartitions", partitions) \
.option("partitionColumn", primary_key_column) \
.option("lowerBound", datatype_boundry_mappings['sqlserver'][primary_key_type]['lower']) \
.option("upperBound", datatype_boundry_mappings['sqlserver'][primary_key_type]['upper']) \
.option("selectMethod", 'direct') \
.load()
在pyspark repl中,我可以确认我有4个分区但是我不知道如何判断每个分区的上/下共享是什么。
In [43]: delta_df.rdd.getNumPartitions()
Out[43]: 4
当我运行保存时,我最终将完成3个执行器/任务,并且最后执行器完成所有工作。当我扩展到一个非常大的(10亿行+)表 - 200个任务,其中199个完成< 100毫秒,最后一个所有工作。
我有几个问题:
我已经尝试将查询转换为spark.sql并进行创建临时视图等。优化器也做同样的事情。 (理解它共享相同的数据帧/连接设置)
上游是mssql jdbc驱动程序mssql-jdbc-6.2.2.jre8,jdk 1.8.112(oracle)。 pyspark 2.2.0.2.6.3.0-235(hdp 2.6.3)