我有疑问。我怎样才能复制数据帧而不再将其卸载到redshift?
val companiesData = spark.read.format("com.databricks.spark.redshift")
.option("url","jdbc:redshift://xxxx:5439/cf?user="+user+"&password="+password)
.option("query","select * from cf_core.company")
//.option("dbtable",schema+"."+table)
.option("aws_iam_role","arn:aws:iam::xxxxxx:role/somerole")
.option("tempdir","s3a://xxxxx/Spark")
.load()
import class.companiesData
class test {
val secondDF = filteredDF(companiesData)
def filteredDF(df: Dataframe): Dataframe {
val result = df.select("companynumber")
result
}
}
在这种情况下,这将两次卸载数据。首先从表中选择*,然后通过仅选择companynumber来卸载它。我如何卸载一次数据并多次操作?这对我来说是个严重的问题。谢谢你的帮助
答案 0 :(得分:1)
通过“卸载”,您的意思是读取数据吗?如果是这样,为什么你确定它被读了两次?实际上,您的代码中没有任何操作,因此我甚至不确定是否正在读取数据。如果您尝试在代码中的其他位置访问secondDF,spark 应该只读取您在类“test”中选择的列。我不是百分之百确定这一点,因为我之前从未使用过红移来将数据加载到spark中。
通常,如果要重用数据帧,则应使用
进行缓存companiesData.cache()
然后,无论何时在数据帧上调用操作,都会将其缓存到内存中。