从 PySpark DataFrame 中删除所有 StructType 列

Sam*_*eer 4 python pyspark

我有一个df读取 JSON 文件的数据框,如下所示:

\n\n
df = spark.read.json("/myfiles/file1.json")\n
Run Code Online (Sandbox Code Playgroud)\n\n

df.dtypes显示以下列和数据类型:

\n\n
\n
id \xe2\x80\x93 string\nName - struct\naddress - struct\nPhone - struct\nstart_date - string\nyears_with_company - int\nhighest_education - string\ndepartment - string\nreporting_hierarchy - struct\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

我只想提取非结构列并创建一个数据框。例如,我生成的数据框应该只有idstart_datehighest_educationdepartment

\n\n

这是我部分工作的代码,因为我只获取department其中填充的最后一个非结构列的值。我想收集所有非结构类型列,然后转换为数据框:

\n\n
names = df.schema.names\n\nfor col_name in names:\n   if isinstance(df.schema[col_name].dataType, StructType):\n      print("Skipping struct column %s "%(col_name))\n   else:\n      df1 = df.select(col_name).collect() \n
Run Code Online (Sandbox Code Playgroud)\n\n

我很确定这可能不是最好的方法,而且我错过了一些我无法确定的东西,所以我将感谢您的帮助。谢谢。

\n

cs9*_*s95 5

使用列表理解:

cols_filtered = [
    c for c in df.schema.names 
    if not isinstance(df.schema[c].dataType, StructType) 
]    
Run Code Online (Sandbox Code Playgroud)

或者,

# Thank you @pault for the suggestion!
cols_filtered = [c for c, t in df.dtypes if t != 'struct']
Run Code Online (Sandbox Code Playgroud)

现在,您可以将结果传递给df.select.

df2 = df.select(*cols_filtered)
Run Code Online (Sandbox Code Playgroud)