【问题标题】:Reading csv files with missing columns and random column order读取缺少列和随机列顺序的 csv 文件
【发布时间】:2018-12-12 18:30:00
【问题描述】:

我有一个架构,我想将其应用于 Databricks 中的 csv 文件。 csv 文件可能包含 6 列(a、b、c、d、e、f),它们可以在 csv 文件中以随机顺序出现。也可能出现缺少一列或多列的情况。所以带有这些标题的 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 apache-spark databricks


【解决方案1】:

您可以在不指定架构的情况下读取 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2016-10-29
    • 2017-04-27
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多