繁体   English   中英

用Apache Spark解析带有模式的文件

[英]parse file with schema in apache spark

下面是我的spark / SCALA程序,用于读取我的源文件。 (CSV文件)

val csv = spark.read
  .format("com.databricks.spark.csv")
  .option("header", "true") //reading the headers
 // .option("mode", "DROPMALFORMED")
  .option("inferSchema", "true")

  .load("C:\\TestFiles\\SAP_ENT_INVBAL.csv"); //.csv("csv/file/path") //spark 2.0 api


csv.show()



csv.printSchema()
csv.show()

}

输出包含文件头,但是对于我的处理,我需要不同的命名约定而不是文件头。

我尝试了几种选择,效果很好。

  1. 重命名数据框列
  2. 使用add(StructField函数

但是我想使我的代码通用。 只需在读取文件时传递模式文件,然后根据模式文件创建带有列的数据框。

请帮助解决此问题。

这是spark-csv文档中有关如何指定自定义架构的示例-

您可以在读取数据时手动指定架构:

import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.types.{StructType, StructField, StringType, IntegerType}

val sqlContext = new SQLContext(sc)       
val customSchema = StructType(Array(
    StructField("year", IntegerType, true),
    StructField("make", StringType, true),
    StructField("model", StringType, true),
    StructField("comment", StringType, true),
    StructField("blank", StringType, true)))

val df = sqlContext.read
    .format("com.databricks.spark.csv")
    .option("header", "true") // Use first line of all files as header
    .schema(customSchema)
    .load("cars.csv")

如果只需要重命名列,则可以使用toDF方法, toDF传递列的新名称,例如

val csv = spark.read.option("header", "true")
  .csv("C:\\TestFiles\\SAP_ENT_INVBAL.csv")
  .toDF("newColAName", "newColBName", "newColCName")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM