我有一个df读取 JSON 文件的数据框,如下所示:
df = spark.read.json("/myfiles/file1.json")\nRun Code Online (Sandbox Code Playgroud)\n\ndf.dtypes显示以下列和数据类型:
\n\n\nRun Code Online (Sandbox Code Playgroud)\nid \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
我只想提取非结构列并创建一个数据框。例如,我生成的数据框应该只有id、start_date、highest_education和department。
这是我部分工作的代码,因为我只获取department其中填充的最后一个非结构列的值。我想收集所有非结构类型列,然后转换为数据框:
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() \nRun Code Online (Sandbox Code Playgroud)\n\n我很确定这可能不是最好的方法,而且我错过了一些我无法确定的东西,所以我将感谢您的帮助。谢谢。
\n使用列表理解:
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)
| 归档时间: |
|
| 查看次数: |
2620 次 |
| 最近记录: |