你好,
我遇到一個問題用火花,當創建一個從原始json dataframe來源。
我定義了一個模式數據,問題是,當有一個定義的一個列值及其之間的不匹配模式,火花不僅將該列設置為null,還所有列後列設置為null。我做了一個最小的例子顯示連接的問題。
基本上,“foo71”的價值觀和“foo72 row_2問題定義的模式“DecimalType (10、7)”。然後,在創建dataframe (df_1),所有列後列“foo7”返回null,盡管模式是正確的。其實我希望的是隻有“foo72”和“foo71”是null,和其他列之後,應該有正確的值列。
我用以下這個筆記本:
1 -磚磚的筆記本數據科學與工程工作區
2——我的集群使用磚運行時版本12.0(包括Apache火花3.3.1,Scala 2.12)
我有一個解決這個問題,但我認為它可能值得報道它修複,因為這可能會在類似的情況下丟失數據的風險。
謝謝你
法紮德
@Farzad Bonabi:
謝謝你報告這個問題。這似乎是一個已知的缺陷在火花處理畸形的十進製值。當一個十進製值輸入不解析JSON數據中的火花,它不僅集這一列空還所有後續列為null。
這個問題的一個解決方案是使用spark.read.json()方法,而不是spark.createDataFrame(),然後選擇感興趣的列。這裏有一個例子:
從pyspark.sql。功能導入坳json_data = " {" row_1 ": {“foo1”:“1”,“foo2”:“2”,“foo3”:“3”,“foo4”:“4”,“foo5”:“5”,“foo6”:“6”,“foo7”:“7”,“foo71”:“1.2345678”,“foo72”:“123.456789”,“foo8”:“8”},“row_2”: {“foo1”:“10”、“foo2”:“20”、“foo3”:“30”,“foo4”:“40”、“foo5”:“50”、“foo6”:“60”,“foo7”:“70”,“foo71”:“invalid_value”、“foo72”:“invalid_value”、“foo8”: " 80 "}}“df = spark.read.json (sc.parallelize ([json_data]),模式= MySchema) df_1 = df.select(坳(“foo1”),坳(“foo2”),坳(“foo3”),坳(“foo4”),坳(“foo5”),坳(“foo6”),坳(“foo7”),坳(“foo71”),坳(“foo72”),坳(“foo8”)) df_1.show ()
這將產生預期的輸出,隻有“foo71”和“foo72”列是零和其餘的列有正確的值。