python-3.x - 使用模式更改 pyspark 数据框标头名称
问题描述
我有几个 csv 大约 10 列,我从不同的来源获取数据,标题名称也不同。我正在尝试使用如下模式更改标题名称。
def transform(df):
schema = StructType([StructField('Name', StringType(), True),
StructField('ID', IntegerType(), True),
StructField('Volume', DoubleType(), True),
StructField('GrossAmount', DoubleType(), True)])
df_transform = spark.createDataFrame(data = df, schema = schema)
return df_transform
df = transform(spark.read.csv("data1.csv", header = True, inferSchema = True))
但我得到以下错误
TypeError:数据已经是一个DataFrame
请让我知道如何实现这一目标。我想编写一个函数,因此我也可以在其他数据帧上使用它。谢谢。
解决方案
您可以在文件读取级别定义架构。
mySchema = StructType([StructField('Name', StringType(), True),
StructField('ID', IntegerType(), True),
StructField('Volume', DoubleType(), True),
StructField('GrossAmount', DoubleType(), True)])
df = spark.read.csv("data1.csv", header = True, schema = mySchema)
如您所见,数据已经是数据框,因此如果您尝试通过此命令创建数据框,则会出现错误。
spark.createDataFrame(data = df, schema = schema)
另外,python UDF 的性能成本很高,因此如果您可以使用 spark 功能而不是 UDF,建议您避免使用。
推荐阅读
- pandas - 是否有动态路径文件,或者所有用户都可以找到下载到不同目录的路径?
- sql - DBeaver 将 SQL 文件导出为带有别名列名称的 INSERT 语句
- python - 从 QDialog 和终止文件之前获取价值
- python - 在 allure-pytest 中获取动态测试描述
- python-3.7 - 如何使用 re.sub 替换特定的迭代?
- javascript - 如何将焦点锁定在文本输入框上以使其始终处于活动状态?
- arrays - 数组中二叉树的存储元素
- scala - 如何从列表中创建新的 DataFrame?
- javascript - 单击时清除/重置绑定计时器/倒计时事件
- reactjs - Azure Dev Ops react-scripts 测试永远挂起