你好所有的,
我一直負責Scala火花代碼轉換為PySpark代碼以最小的變化(直譯)。
我遇到一些自稱是理解列表的代碼。看看以下代碼片段:
% scala val desiredColumn = Seq (“firstName”、“middleName”,“姓”)val colSize = desiredColumn。大小val columnList =(我< - 0直到colSize)收益率美元“元素”.getItem (i) .alias (desiredColumn(我)打印(columnList) / / df_nameSplit。選擇(columnList: _ *),告訴(假)
輸出這個代碼片段:
向量([0]firstName,元素middleName[1],[2]的元素為lastName) desiredColumn: Seq [String] =列表(firstName、middleName lastName) colSize: Int = 3 columnList: scala.collection.immutable.IndexedSeq [org.apache.spark.sql。列)=向量([0]firstName,元素middleName[1],[2]的元素為lastName)
同時,“df_nameSplit”的模式數據幀是下麵列的元素是一個分裂的“名稱”列:
根|——名稱:字符串(nullable = true) |——dob_year:字符串(nullable = true) |——性別:字符串(nullable = true) |——工資:長(可空= true) |——元素:數組(nullable = true) | |——元素:字符串(containsNull = false)
PySpark版本的代碼我能夠提出:
desired_columns = [“firstName”、“middleName”,“姓”)col_size len (desired_columns) col_list = = [df_nameSplit.select(坳(“元素”).getItem (i) .alias (desired_columns[我]))我的範圍(col_size)]打印(col_list) # df_nameSplit.select (* col_list) .display ()
輸出PySpark代碼:
[DataFrame [firstName: string], DataFrame middleName: string, DataFrame [lastName: string]]
有人能幫我,我錯了嗎?
標簽@Kaniz Fatma更好達到!
嗨@Riyaz阿裏,
檢查這一個:
desired_columns = [“firstName”、“middleName”,“姓”)col_size len (desired_columns) col_list = =[坳(“元素”).getItem (i) .alias (desired_columns[我])範圍(col_size)]我的打印(col_list)
的輸出是:
(列<元素[0]firstName的>,列<“元素[1]為middleName”>,列<的元素[2]為lastName >)
測試:
從pyspark.sql。類型進口StringType ArrayType arrayCol = ArrayType (StringType(),假)模式= StructType ([StructField (“id”, StringType(),真的),StructField(“元素”,ArrayType (StringType()),真的)])data =[(“1”,(“約翰”,“傑克”,“母鹿”])]df = spark.createDataFrame (data =數據,模式=)df.printSchema () df.show()根| - id:字符串(nullable = True) |——元素:數組(nullable = True) | |——元素:字符串(containsNull = True) + - - - + - - - - - - - - - - - - - - - - - - | + | | id元素+ - - - + - - - - - - - - - - - - - - - - - - + | 1 |(約翰,傑克,doe) | + - - - + - - - - - - - - - - - - - - - - - - + df.select (* col_list) .display()輸出:+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + | firstName | middleName | lastName | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +約翰·傑克| | | doe | + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
嗨@Riyaz阿裏,
檢查這一個:
desired_columns = [“firstName”、“middleName”,“姓”)col_size len (desired_columns) col_list = =[坳(“元素”).getItem (i) .alias (desired_columns[我])範圍(col_size)]我的打印(col_list)
的輸出是:
(列<元素[0]firstName的>,列<“元素[1]為middleName”>,列<的元素[2]為lastName >)
測試:
從pyspark.sql。類型進口StringType ArrayType arrayCol = ArrayType (StringType(),假)模式= StructType ([StructField (“id”, StringType(),真的),StructField(“元素”,ArrayType (StringType()),真的)])data =[(“1”,(“約翰”,“傑克”,“母鹿”])]df = spark.createDataFrame (data =數據,模式=)df.printSchema () df.show()根| - id:字符串(nullable = True) |——元素:數組(nullable = True) | |——元素:字符串(containsNull = True) + - - - + - - - - - - - - - - - - - - - - - - | + | | id元素+ - - - + - - - - - - - - - - - - - - - - - - + | 1 |(約翰,傑克,doe) | + - - - + - - - - - - - - - - - - - - - - - - + df.select (* col_list) .display()輸出:+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + | firstName | middleName | lastName | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +約翰·傑克| | | doe | + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
另一個後續問題,如果你不介意的話。@Pat Sienkiewicz
正如我試圖解析名字列到多個列。我遇到下麵的數據:
(“詹姆斯,\”,B \”,史密斯”,“2018”,“M”, 3000年)
為了解析這些comma-included中間的名字,我用的是“from_csv”功能。
Scala火花代碼看起來像下麵的:
% scala使用from_csv函數/ /模式分裂定義列。val選項=地圖(“9”- >”、“)val df_split = df。選擇(“*”美元,F.from_csv(“名字”美元,simpleSchema選項).alias (“value_parsed”)) val df_multi_cols = df_split。選擇(“*”、“value_parsed . *”) .drop (value_parsed) df.show (false) df_multi_cols.show(假)
上麵提到的模式如下:
scala中的% scala模式/ / val simpleSchema = new StructType閥門()(“firstName”, StringType)閥門閥門(“middleName”, StringType)(“姓”,StringType)
現在PySpark我的代碼是:
#模式PySpark simple_schema = (StructType閥門()(“firstName”, StringType())閥門(middleName, StringType())閥門(“姓”,StringType()))選項= {' 9 ':','}df_split = df_is。選擇(“*”,from_csv (df_is.name、simple_schema選項).alias (“value_parsed”)) # df_split.printSchema ()
製造一個錯誤:“TypeError:模式參數應該是一個列或字符串的
現在錯誤後,如果我定義SQL中的架構風格(引用),它的工作原理。
選擇= {' 9 ':','}df_split = df_is。選擇(“*”,from_csv (df_is.name“firstName字符串,middleName字符串,lastName字符串”,選項).alias (“value_parsed”)) df_split.printSchema ()
我好奇為什麼在PySpark Scala中的火花,為什麼不工作。任何領導將不勝感激。
最好的,
Riz