データフレームを生成する spark.read JDBC を使用しているときに、そのデータフレームで df.write を 2 回実行すると、誰かが言及しました。**ソースへの 2 つの接続を作成しますか? ** このスパークの内部構造について、さらに洞察を得るために助けが必要です。
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 を取得して、2 つの場所に書き込みます。
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"
以下のようにメインでこれを呼び出すと、ソースへの 2 つの接続が本当に作成されますか? もし、そうなら; それを回避し、一度だけ読み取り専用にする方法は何ですか。ここでの load の spark のドキュメントでは、 load() 「データ ソースからデータを読み込み、 a:class として返す」と引用されていますDataFrame
。したがって、ここで内部的に何が行われているのかについて、より多くのコンテキストが必要です。
def main():
df=read_df()
status = write_df_delta(df)
status = write_df_csvserde(df)
if __name__ == '__main__' :
main()