[英]How to change the schema of existing dataframe
问题陈述:我有一个 csv 文件,其中包含大约 100 多个字段。我需要对这些字段执行转换并生成新的 80 多个字段,并仅将这些新字段以 parquet 格式写入 s3。
parquet 预定义架构 = 80+ 新填充的字段 + 一些未填充的字段。
有什么方法可以在将数据写入 s3 时传递此预定义的镶木地板架构,以便这些额外字段也填充 null 数据。
select 对 select 只有 80 多个字段没有用,因为预定义架构可能有大约 120 个预定义字段。
下面是示例数据和转换要求CSV数据
aid, productId, ts, orderId
1000,100,1674128580179,edf9929a-f253-487
1001,100,1674128580179,cc41a026-63df-410
1002,100,1674128580179,9732755b-1207-471
1003,100,1674128580179,51125ddd-4129-48a
1001,200,1674128580179,f4917676-b08d-41e
1004,200,1674128580179,dc80559d-16e6-4fa
1005,200,1674128580179,c9b743eb-457b-455
1006,100,1674128580179,e8611141-3e0e-4d5
1002,200,1674128580179,30be34c7-394c-43a
镶木地板架构
def getPartitionFieldsSchema() = {
List(
Map("name" -> "company", "type" -> "long",
"nullable" -> true, "metadata" -> Map()),
Map("name" -> "epoch_day", "type" -> "long",
"nullable" -> true, "metadata" -> Map()),
Map("name" -> "account", "type" -> "string",
"nullable" -> true, "metadata" -> Map()),
)
}
val schemaMap = Map("type" -> "struct",
"fields" -> getPartitionFieldsSchema)
简单的例子
val dataDf = spark
.read
.format("csv")
.option("header", "true")
.option("inferSchema", "true")
.load("./scripts/input.csv")
dataDf
.withColumn("company",lit(col("aid")/100))
.withColumn("epoch_day",lit(col("ts")/86400))
.write // how to write only company, epoch_day, account ?
.mode("append")
.csv("/tmp/data2")
Output 应该有以下几列:company, epoch_day, account
这就是我对您的问题的理解:您想阅读一些 csv 并将它们转换为 s3 中的镶木地板。 在转换过程中,您需要在 csv 文件中的现有列的基础上创建 3 个新列。 但是由于只计算了 3 个新列中的 2 个,因此 output 只显示了两个新列,而不是 3 个。
在这种情况下,您可以在 redshift 中创建一个外部表,并指定所有列。 结果,即使有些列没有被馈送,您的外部表中也会有 null。
问题未解决?试试以下方法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.