PySpark中如何通过列表生成指定表头的Row对象并创建DataFrame
问题解决:PySpark通过列表动态定义Row字段生成DataFrame
问题根因
pyspark.sql.Row的构造函数需要接收多个独立的位置参数作为字段名,你直接传入完整列表对象、或者将列表拼接为单个字符串传入,都会被识别为1个参数,最终只会生成1个字段,和硬编码多个字符串参数的效果完全不同。
解决方案
方案1:用解包语法动态传参给Row
只需要在你的表头列表前加*解包符,就能把列表内的每个元素拆成独立参数传给Row,和你硬编码的效果完全一致:
from pyspark.sql import Row # 你的原有变量 a = [i for i in df_dict.values()] Mylist = ["id","Salary","department"] # 对表头列表用*解包,替代硬编码参数 R = Row(*Mylist) sp = spark.createDataFrame([R(*i) for i in zip(*a)])
方案2:直接指定schema参数(更简洁)
实际上不需要手动构造Row对象,spark.createDataFrame本身支持直接传入表头列表作为schema参数,代码更短执行效率更高:
a = [i for i in df_dict.values()] Mylist = ["id","Salary","department"] # 直接传逐行数据和schema参数即可生成目标DataFrame sp = spark.createDataFrame(zip(*a), schema=Mylist)
两种方案都可以得到字段名、数据完全匹配的DataFrame,无需自定义列表转字符串的工具函数。
内容的提问来源于stack exchange,提问作者Anuj Mahajan
相关产品推荐
相关产品推荐

