读取缺少列和随机列顺序的 csv 文件
Reading csv files with missing columns and random column order
我有一个模式要应用于 Databricks 中的 csv 文件。
csv 文件可能包含 6 列(a、b、c、d、e、f),它们可以随机顺序出现在 csv 文件中。也可能会出现一列或多列丢失的情况。所以带有这些 headers 的 csv 文件是有效的
a,b,c,d,e,f
f,e,d,c,a,b
a,b,c
d,e,f
我可以创建自定义架构,但这不能处理不同的顺序,也不能处理缺失的列。它们是按顺序应用的。关于如何处理这个问题有什么想法吗?
customSchema = StructType() \
.add("a", DoubleType(), True) \
.add("b", DoubleType(), True) \
.add("c", DoubleType(), True) \
.add("d", DoubleType(), True) \
.add("e", DoubleType(), True) \
.add("f", DoubleType(), False)
data = sqlContext.read.format("csv") \
.option("header", "true") \
.option("delimiter", ",") \
.schema(customSchema) \
.load("*.csv")
您可以在不指定架构的情况下读取 csv 文件,然后按照您喜欢的方式调整数据框。在 scala 中,这将如下所示:
val df = spark.read.format("csv")
.option("header", "true")
.load("x.csv")
val cols = Seq("a", "b", "c", "d", "e", "f")
/* Here I select and cast the column if it exists.
I create a null column otherwise */
val shaped_df = df.select( cols.map(c=>
if(df.columns.contains(c))
col(c).cast("double")
else
lit(null).cast("double").alias(c)
) :_* )
shaped_df.printSchema()
root
|-- a: double (nullable = true)
|-- b: double (nullable = true)
|-- c: double (nullable = true)
|-- d: double (nullable = true)
|-- e: double (nullable = true)
|-- f: double (nullable = true)
我有一个模式要应用于 Databricks 中的 csv 文件。 csv 文件可能包含 6 列(a、b、c、d、e、f),它们可以随机顺序出现在 csv 文件中。也可能会出现一列或多列丢失的情况。所以带有这些 headers 的 csv 文件是有效的
a,b,c,d,e,f
f,e,d,c,a,b
a,b,c
d,e,f
我可以创建自定义架构,但这不能处理不同的顺序,也不能处理缺失的列。它们是按顺序应用的。关于如何处理这个问题有什么想法吗?
customSchema = StructType() \
.add("a", DoubleType(), True) \
.add("b", DoubleType(), True) \
.add("c", DoubleType(), True) \
.add("d", DoubleType(), True) \
.add("e", DoubleType(), True) \
.add("f", DoubleType(), False)
data = sqlContext.read.format("csv") \
.option("header", "true") \
.option("delimiter", ",") \
.schema(customSchema) \
.load("*.csv")
您可以在不指定架构的情况下读取 csv 文件,然后按照您喜欢的方式调整数据框。在 scala 中,这将如下所示:
val df = spark.read.format("csv")
.option("header", "true")
.load("x.csv")
val cols = Seq("a", "b", "c", "d", "e", "f")
/* Here I select and cast the column if it exists.
I create a null column otherwise */
val shaped_df = df.select( cols.map(c=>
if(df.columns.contains(c))
col(c).cast("double")
else
lit(null).cast("double").alias(c)
) :_* )
shaped_df.printSchema()
root
|-- a: double (nullable = true)
|-- b: double (nullable = true)
|-- c: double (nullable = true)
|-- d: double (nullable = true)
|-- e: double (nullable = true)
|-- f: double (nullable = true)