如何为具有许多列的sparkDataframe定义模式

cig3rfwq  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(370)

我有Spark in_df 有300多列,其中一列是字符串,其余的是双列。我需要在其上运行groupedmap和udf,并在运行之前定义输出的模式。在输出的列数应该相同但类型不同的情况下,如何定义该模式?我能找到的几个Pandas自定义项示例通常只使用 in 作为输出模式。
我见过的一种方法 withColumn 以及 cast()in_df . 这是最佳做法吗?如果我想我的输出是一个完全不同的形状比 in_df 但是有太多的列需要手工编码吗?我还没找到合适的资源。

cidc1ykv

cidc1ykv1#

乌辛 pyspark.sql.types.StructType.fromJson() 您可以从json动态构造模式。
根据您的要求,我更改了用于“col\e”的数据类型,您可以根据您的用例将数据类型更改为一列或多列。

  1. df = spark.read.csv('test.csv',header=True,inferSchema=True)
  2. fields = []
  3. for f in json.loads(df.schema.json())["fields"]:
  4. if f["name"] == "col_e":
  5. fields.append(StructField("col_e", StringType(), True))
  6. else:
  7. fields.append(StructField.fromJson(f))
  8. schema = StructType(fields)
  9. @F.pandas_udf(schema, F.PandasUDFType.GROUPED_MAP)
  10. def many_cols_data(pdf):
  11. pdf['col_e'] = "test"
  12. return pdf
  13. df.groupBy(
  14. 'col_a'
  15. ).apply(
  16. many_cols_data
  17. ).show()

输入文件test.csv

  1. col_a,col_b,col_c,col_d,col_e
  2. a,2,3,4,5
  3. b,2,3,4,5
  4. c,2,3,4,5

结果是什么

  1. +-----+-----+-----+-----+-----+
  2. |col_a|col_b|col_c|col_d|col_e|
  3. +-----+-----+-----+-----+-----+
  4. | c| 2| 3| 4| test|
  5. | b| 2| 3| 4| test|
  6. | a| 2| 3| 4| test|
  7. +-----+-----+-----+-----+-----+
展开查看全部

相关问题