使用pyspark更新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

我知道使用Spark更新MySQL表是不可能的,但我尝试了一些方法来避免它,但它不起作用

假设我有一个表
last\u modification
,其中我将用户名保存为id,并显示来自具有不同服务的系统的上次修改日期。每次处理某些数据时,我都必须更新来自该用户的数据被修改的日期,如果新用户进入系统,我必须将其插入表中

这个过程是:

  • 从SQL表中读取数据:

    df_last_mod = sqlContext.read.jdbc(url=url, table="last_modification", properties=properties)
    
  • 从该数据帧中提取将被处理的用户(
    last\u mod\u actual
    ),并将其余用户保存在RDD中(
    last\u mod\u aux
    ):

  • 从已处理用户的RDD(现在命名为
    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")
    
  • 最后,我使用JDBC编写表:

    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()