代码之家  ›  专栏  ›  技术社区  ›  CodeHunter

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

  •  0
  • CodeHunter  · 技术社区  · 8 年前

    当我加载一个 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
      }
    }
    

    我能得到 DateTime , Integer , Double , String 作为我的文件的数据类型。但是我想实现基于我自己的自定义数据类型 regex 模式,如SSN、VIN-ID、PhoneNumber等字段,它们都有一个固定的模式,可以使用 正则表达式 。这将使模式提取过程对我来说更加准确和精确。例如,假设我有一个列,其中包含由5个或更多字母和2个或更多数字组成的数据,我可以说这个列是类型 身份证件 .

    关于是否可以使用Scala/Spark执行此操作,您有什么想法吗?如果可能,请让我知道实施部分或技术文档的来源。

    0 回复  |  直到 8 年前