从pySpark SQL获取新行ID写入远程mysql db(JDBC)

时间:2018-09-05 11:52:51

标签: mysql jdbc pyspark pyspark-sql

我正在使用pyspark-sql通过JDBC在远程mysql数据库中创建行。

我有两个表parent_table(id, value)child_table(id, value, parent_id),因此parent_id的每一行可能根据需要与child_id中的行关联。

现在,我想创建一些新数据并将其插入数据库。我正在为write操作使用代码准则here,但我希望能够执行以下操作:

parentDf = sc.parallelize([5, 6, 7]).toDF(('value',))
parentWithIdDf = parentDf.write.mode('append') \
                         .format("jdbc") \
                         .option("url", "jdbc:mysql://" + host_name + "/"
                            + db_name).option("dbtable", table_name) \
                         .option("user", user_name).option("password", password_str) \
                         .save()
# The assignment at the previous line is wrong, as pyspark.sql.DataFrameWriter#save doesn't return anything.

我希望上面代码的最后一行可以返回一个DataFrame,其中每行都有新的行ID,这样我就可以做到

childDf = parentWithIdDf.flatMap(lambda x: [[8, x[0]], [9, x[0]]])
childDf.write.mode('append')...

表示最后我将在远程数据库中拥有

parent_table
 ____________
| id | value |
 ____________
| 1  |   5   |
| 2  |   6   |
| 3  |   7   |
 ____________

child_table
 ________________________
| id | value | parent_id |
 ________________________
| 1  |   8   |    1      |
| 2  |   9   |    1      |
| 3  |   8   |    2      |
| 4  |   9   |    2      |
| 5  |   8   |    3      |
| 6  |   9   |    3      |
 ________________________ 

正如我在上面的第一个代码段中所写的那样,pyspark.sql.DataFrameWriter#save在返回its documentation时没有返回任何内容,那么我该如何实现呢?

我做错了什么吗?看来没有办法从Spark的动作(save)取回数据,而我想将此动作用作转换,shich导致我认为我可能会想到错误的方式。

1 个答案:

答案 0 :(得分:0)

一个简单的答案是使用时间戳+自动递增编号创建唯一的ID。仅在某个时间实例中只有一台服务器正在运行时,这才起作用。 :)