[英]Persistent PySpark Dataframe from a Hive query
我從 Hive 表中獲取一些數據:
df = sqlContext.sql('select shubiru, date from thebigtable bt where bt.num > 10 ')
df.show() # here the query is processed and the results shown
這工作正常。 現在我想對 df 進行操作,但是每次我對 df 進行操作時,它都會再次運行針對 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 上調用persist
,查詢將不會再次運行:
df.cache()
df = df.withColumn('fdate', dt_udf(df.date))
但沒有骰子,查詢再次針對 Hive 運行並由 UDF 處理。 有沒有辦法在內存中緩存查詢結果並在數據幀上運行操作,而無需每次都點擊 Hive?
每當對數據執行操作時,Spark SQL 都會從數據源(在您的情況下為 Hive)中提取數據。 在這種情況下,您試圖在cache()
之后重命名列,這將是無用的。 我的建議是有類似的東西
df = df.withColumn('fdate', dt_udf(df.date)).withColumn('date_column_2', dt_udf(df.date)).cache()
此語句之后的所有操作都將對保存在 spark 中的數據進行操作。 然而,緩存大量數據會自動驅逐舊的 RDD 分區,並且需要返回到 hive 來重新生成丟失的分區。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.