我有一些數據在銀,我讀一個視圖使用__apply_changes函數。我在此基礎上,創建一個表,然後我想創建我的金牌,之後做一個.groupBy()和.pivot ()。轉換我的金牌並沒有給我任何錯誤消息,他們隻是沒有做。如果我創建我的金牌基於視圖而不是表,轉換完成。見底的例子。
這是我的代碼:
從pyspark.sql進口dlt。功能導入坳、concat_ws爆炸,分裂,explode_outer, posexplode, concat,點燃,expr,首先,create_map @dlt。視圖def silver_messages():“”“銀信息表”“返回spark.readStream.table @dlt (“eqs_cloud.__apply_changes_storage_silver_messages”)。視圖def groups_hierarchy_vw():““得到所有組織層次結構”“”分配= dlt.read_stream .select (“silver_messages”) (“assignedToUnit。*”) from_unit = dlt.read_stream .select (“silver_messages”) (“fromUnit。*”) to_unit = dlt.read_stream .select (“silver_messages”) (“toUnit。*”) groups_hierarchy_vw = assigned.unionByName (from_unit) .unionByName (to_unit)返回groups_hierarchy_vw @dlt。表def groups_hierarchy_tbl():返回dlt.read_stream @dlt (“groups_hierarchy_vw”)。表def groups_hierarchy_tbl_pivoted():返回(dlt.read (groups_hierarchy_tbl) .select (“id”,“名字”,(“路徑”,“/”).alias (“groups_in_path”), posexplode(分裂(“路徑”,“/”)).alias (“pos”、“價值”)).select (“id”、“名稱”concat(點燃(“集團”)、“pos”) .alias (“group_name”), expr (“groups_in_path (pos)”) .alias (val)) .groupBy .pivot (“id”、“名稱”)(“group_name”) .agg(第一(val)))
有一種方式我可以直接使用groups_hierarchy_vw視圖底部的金牌?如果我進入dlt.read_stream (“groups_hierarchy_vw”)我得到一個錯誤”pyspark.sql.utils。AnalysisException:查詢與流媒體來源必須執行writeStream.start ();“
這是一個捏造的例子你可以嚐試。
進口熊貓pyspark.sql pd。功能導入坳、concat_ws爆炸,分裂,explode_outer, posexplode, concat,點燃,expr,首先,create_map pdf = pd。DataFrame ({" id ":[“1001”、“1002”、“1003”),“名字”:[“Dep1”、“Dep2”,“Dep3”),“路徑”:[“1001”,“1001/1002”,“1001/1002/1003”)})df = spark.createDataFrame (pdf) df.write.mode(覆蓋).saveAsTable @dlt (“fabricated_testtable”)。視圖def fabricated_hierarchy_vw():返回spark.read.table @dlt (“fabricated_testtable”)。表def fabricated_tbl_pivoted():返回(dlt.read (fabricated_hierarchy_vw) .select (“id”,“名字”,(“路徑”,“/”).alias (“groups_in_path”), posexplode(分裂(“路徑”,“/”)).alias (“pos”、“價值”)).select (“id”、“名稱”concat(點燃(“集團”)、“pos”) .alias (“group_name”), expr (“groups_in_path (pos)”) .alias (val)) .groupBy .pivot (“id”、“名稱”)(“group_name”) .agg(第一(val)))
這給預期的結果:
但如果你改變@dlt第12行。表,轉換不執行,結果是這樣的:
我發現了一個臨時的解決辦法來解決這個問題。
.pivot (“columnName”)應該自動抓取所有能找到的值,但出於某種原因,它不。我需要指定的值,使用
.pivot (“group_name”、“group0”、“group1”、“group2”……)
或
.pivot (“group_name”,“{}”.format(我)我的範圍(8)))