sparkjdbc-source的多个连接?

3b6akqbq  于 2021-05-24  发布在  Spark
关注(0)|答案(1)|浏览(421)

有人提到,当我们使用spark.read jdbc生成一个Dataframe时,如果我们在该Dataframe上执行df.write两次,则会生成一个Dataframe**它是否创建到源的两个连接?**我需要一些关于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的文档在此处引用load()“从数据源加载数据并将其作为:类返回 DataFrame “所以我们需要更多的背景来解释内部在起什么作用。

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

mzsu5hc01#

因为你没有 .cache 或者 .persist 它将从jdbc源代码读取两次。
两个明显的行动。
缓存也有成本。

相关问题