【问题标题】:spark jdbc - multiple connections to source?spark jdbc - 到源的多个连接?
【发布时间】:2021-01-16 08:42:27
【问题描述】:

有人提到,当我们使用生成数据帧的 spark.read JDBC 时,如果我们在该数据帧上执行两次 df.write。 **它会创建两个到源的连接吗? ** 我需要一些帮助,以更深入地了解 spark 的内部工作原理。

假设我创建了一个返回 df 的函数

read_df():
df = spark.read.format("jdbc").option("header", "true").option("inferSchema","true").option("url",jdbc_str[0]).option("lowerBound", mini).option("upperBound", maxi).option("numPartitions", num_partitions). option("partitionColumn", df_info[2]).option("dbtable", tablename).option("user", df_info[0]).option("password", df_info[1]).option("driver", "com.informix.jdbc.IfxDriver").load()
return df

现在我把上面函数返回的df写在两个地方。

def write_df_delta(df):
df.write.format("delta").partitionBy("partitioncolumn").save(location)
return "successful"
def write_df_csvserde(df):
df.coalesce(1).write.option("header", "true").mode("append").csv(target_dir)
return "successful"

现在,如果我在 main 中调用它,如下所示,那真的会与源建立两个连接吗?如是;有什么方法可以避免这种情况并且只读一次。 spark for load here 的文档引用 load() “从数据源加载数据并将其作为 a:classDataFrame 返回。”所以需要更多关于这里内部发挥作用的背景信息。

def main():
df=read_df()
status = write_df_delta(df)  
status = write_df_csvserde(df)
if __name__ == '__main__' :
    main()

【问题讨论】:

  • 你能接受答案吗?

标签: dataframe apache-spark hadoop spark-jdbc


【解决方案1】:

由于您没有 .cache.persist,它将从 JDBC 源读取两次。

两个行动明显。

缓存也是有代价的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    相关资源
    最近更新 更多