使用pyspark更新MySQL表
我知道使用Spark更新MySQL表是不可能的,但我尝试了一些方法来避免它,但它不起作用 假设我有一个表使用pyspark更新MySQL表,mysql,apache-spark,pyspark,mysql-python,pyspark-sql,Mysql,Apache Spark,Pyspark,Mysql Python,Pyspark Sql,我知道使用Spark更新MySQL表是不可能的,但我尝试了一些方法来避免它,但它不起作用 假设我有一个表last\u modification,其中我将用户名保存为id,并显示来自具有不同服务的系统的上次修改日期。每次处理某些数据时,我都必须更新来自该用户的数据被修改的日期,如果新用户进入系统,我必须将其插入表中 这个过程是: 从SQL表中读取数据: df_last_mod = sqlContext.read.jdbc(url=url, table="last_modification", pr
last\u modification
,其中我将用户名保存为id,并显示来自具有不同服务的系统的上次修改日期。每次处理某些数据时,我都必须更新来自该用户的数据被修改的日期,如果新用户进入系统,我必须将其插入表中
这个过程是:
df_last_mod = sqlContext.read.jdbc(url=url, table="last_modification", properties=properties)
last\u mod\u actual
),并将其余用户保存在RDD中(last\u mod\u aux
):
last\u mod\u RDD
)更新修改日期,并将其加入未修改用户的RDD:
union_rdd = last_mod_rdd.union(last_mod_aux)
header = (sqlContext
.createDataFrame(union_rdd,header_schema)
.createOrReplaceTempView("union_header")
)
sqlContext.cacheTable("union_header")
dd = sqlContext.table("union_header")`
dd.write.format('jdbc').options(
url= url,
driver="com.mysql.jdbc.Driver",
dbtable="last_modification",
user=user,
password=password).mode('overwrite').save()
这段代码有时似乎有效,但另一些代码只保存修改过的用户并删除未修改过的用户。在写入SQL表之前插入
dd.show()
时,程序似乎工作得更好,但不知道真正的原因,它的工作有点随机。可能重复的问题请仔细阅读我的问题,不是同一个问题。在我的代码中,我创建一个中间表是为了保存RDD并避免您提到的问题。您不创建“中间表”。在Spark中创建视图和缓存是一种优化,而不是保证。您所做的并不能避免这个问题。这是一个保证表的视图被缓存的解决方案,还是至少即使原始MySQL表被覆盖,数据帧的内容也不会被删除?否,cache
不能用于Spark中的正确性。如果您想让它正常工作,可以创建一个表(在Spark中或者在MySQL中创建一个临时表)。
dd = sqlContext.table("union_header")`
dd.write.format('jdbc').options(
url= url,
driver="com.mysql.jdbc.Driver",
dbtable="last_modification",
user=user,
password=password).mode('overwrite').save()