我如何讀DataFrame鋪文件,轉換和寫這個修改DataFrame回到相同的相同的鑲花文件嗎?
如果我試圖這樣做,我得到一個錯誤,這是可以理解的,因為火花讀取從源和一個不能同時寫回。讓我——再現問題
df =火花。createDataFrame([(10),(20),(30)],[‘性’,‘日期’])
#另存為拚花
df.repartition (1) .write.format(鋪).mode(覆蓋).save(…/臨時的)
#加載它
df = spark.read.format(鋪).load(…/臨時的)
#保存它——這產生錯誤
df.repartition (1) .write.format(鋪).mode(覆蓋).save(…/臨時的)
錯誤:
. io .FileNotFoundException:請求的文件maprfs: / / / mapr - 00000 /…/ temp /部分f67d5a62 - 36 - f2 - 4 - dd2 - 855 a - 846 - f422e623f c000.snappy。拚花是不存在的。它是可能的底層文件已經更新。您可以顯式地火花的緩存失效運行“REFRESH TABLE表”命令的SQL或重新創建數據集/ DataFrame參與。
一個解決方案這個問題是與不同的命名保存DataFrame鋪文件夾- >刪除舊的鑲花文件夾- >將這個新創建的拚花文件夾重命名為舊的名字。但這是非常沒有效率的方法,更不用說那些DataFrames有數十億的行。
我做了一些研究,發現,建議做一些刷新表刷新元數據,我們可以看到這裏和這裏。
誰能建議如何讀,然後寫回到同樣的拚花文件?
這種方式
這是工作…
進口org.apache.spark.sql.functions._val df = Seq ((10), (20), (30)) .toDS。toDF(“性”、“日期”)df.show (false) / /保存它
df.repartition (1) .write.format .mode(“鋪”)(“覆蓋”).save (“……/ temp”)
/ /讀回來val df1 = spark.read.format(“鋪”).load (…/ temp) val df2 = df1。withColumn(“清理”,點燃(“快速銀想清理”))
/ /下麵2是重要的步驟
緩存
和顯示
迫使光行動顯示(1)有哪些文件未找到例外會. .
df2。緩存/ /緩存來避免FileNotFoundException df2.show(2) / /光行動或println (df2.count)也很好
df2.repartition (1) .write.format .mode(“鋪”)(“覆蓋”).save (“……/ temp”)
df2.show(假)
工作肯定是唯一你需要緩存和執行小行動顯示(1)這是altermative路線思想提出的強製用戶需要它。
結果……文件:閱讀和覆蓋