如何让Scala脚本在csv / json模式中推断自定义列类型?

时间:2018-05-29 20:55:30

标签: scala apache-spark apache-spark-sql database-schema

我在csv使用SQLContext加载SparkSession文件时尝试推断架构。请注意,我不想在这里使用class,因为我在加载数据文件模式时会尽快推断它,因为在加载文件之前我没有关于文件的数据类型或列名的任何信息。

以下是我在Scala中尝试的内容:

package example
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import java.io.File
import org.apache.spark.sql.SparkSession
//import sqlContext.implicits._


object SimpleScalaSpark {
  def main(args: Array[String]) {
    //val conf = new SparkConf().setAppName("Simple Application").setMaster("local[*]")
    val spark = SparkSession
      .builder()
      .master("local[*]")
      .appName("Spark Hive Example")
      .config("spark.sql.warehouse.dir", "local")
      .getOrCreate()
    //val etl1Rdd = spark.sparkContext.wholeTextFiles("etl1.json").map(x => x._2)
    val jsonTbl = spark.sqlContext.read.format("org.apache.spark.csv")
      .option("header", true)
      .option("inferSchema", true)
      .option("dateFormat","MM/dd/yyyy HH:mm")
      .csv("s1.csv")

    // print the inferred schema
    jsonTbl.printSchema
  }
}

我可以将DateTimeIntegerDoubleString作为我的文件的数据类型。但我想基于我自己的regex模式实现自定义数据类型,例如SSN,VIN-ID,PhoneNumber等字段,这些模式都具有可以使用regex检测到的固定模式。这将使我的模式提取过程更加准确和精确。例如,假设我有一个包含由5个或更多字母和2个或更多数字组成的数据的列,我可以说此列的类型为 ID

有关使用Scala / Spark是否可以执行此操作的任何想法?如果可能,请告知我实施部分或技术文档的来源。

0 个答案:

没有答案