簡體   English   中英

來自 Hive 查詢的持久性 PySpark 數據幀

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM