我正在使用PySpark SQL,我想从RedShift中检索表,将它们保存在内存中,然后应用一些连接和转换。 我想将连接和转换应用于内存数据,而不是将使用转换创建的sql计划直接应用于Redshift。
当我检索数据时,它只保存模式,对吧?
如果我使用createTempView(),它会在sparkcontext中保存一个视图而不是数据,对吗?
如果我在获取数据帧后使用cache(),它会将数据保存在内存中?接下来的转换应用于内存中吗?
df = manager.session.read.jdbc(url=url, table=table, properties={"driver": driver, "user": user, "password": password})
df1 = manager.session.read.jdbc(url=url, table=table1, properties={"driver": driver, "user": user, "password": password})
df2 = manager.session.read.jdbc(url=url, table=table2, properties={"driver": driver, "user": user, "password": password})
df_res = df.union(df2)
df_res = df_res.groupBy("seq_rec", "seq_res").agg({'impuesto': 'sum'}).withColumnRenamed("SUM(impuesto)", "pricing")
df_result = df.join(df_res, [df.seq == df_res.seq_rec, df.res == df_res.seq_res])
之后我将数据框保存为avro文件,并且在这里应用了所有转换?
答案 0 :(得分:1)
当我检索数据时,它只保存模式,对吧?
是的,这是正确的。
如果我使用createTempView(),它会在sparkcontext中保存一个视图而不是数据,对吗?
同样在这里。
如果我在获取数据帧后使用cache(),它会将数据保存在内存中?接下来的转换应用于内存中吗?
没有。当数据集首次加载时,它可以缓存内存中的数据,其中分数取决于可用资源。它不会急切地获取数据。
SQL中有一个旧的,更长的文档CACHE TABLE
,它曾被用来急切地获取数据并尝试缓存它。
spark.sql("CACHE TABLE foo")