我从Hive表中获取了一些数据:
import pyspark.sql.functions as func
from datetime import datetime
from pyspark.sql.types import TimestampType
dt_udt = func.udf(lambda x: datetime.strptime(str(x), '%Y%m%d') if x else None, TimestampType())
df = df.withColumn('fdate', dt_udt(df.date))
df.show() # here the query is run again and the transformation is done
并且工作正常。现在我想操作df,但每次我对df进行操作时,它会再次运行针对Hive的查询:
persist
所以我认为如果我在df上调用df.cache()
df = df.withColumn('fdate', dt_udf(df.date))
,则不会再次运行查询:
{{1}}
但没有骰子,查询再次针对Hive运行并由UDF处理。有没有办法在内存中缓存查询结果并在数据帧上运行操作而不是每次都遇到Hive?
答案 0 :(得分:1)
只要对数据执行操作,Spark SQL就会从DataSource(在您的Hive情况下)中提取数据。在这种情况下,您尝试在cache()
之后重命名列,这将是无用的。我的建议是拥有像
df = df.withColumn('fdate', dt_udf(df.date)).withColumn('date_column_2', dt_udf(df.date)).cache()
此语句之后的所有操作都将对spark中持久存储的数据进行操作。但是,缓存大量数据会自动驱逐较旧的RDD分区,并需要返回配置单元重新生成丢失的分区。