如何使用Scala DataFrameReader选项方法

时间:2016-03-22 19:17:24

标签: scala apache-spark

Scala DataFrameReader有一个函数“option”,它具有以下签名:

 def  option(key: String, value: String): DataFrameReader 
   // Adds an input option for the underlying data source. 

那么什么是底层数据源的“输入选项”,有人可以在这里分享一个如何使用这个函数的例子吗?

3 个答案:

答案 0 :(得分:4)

可用选项列表因文​​件格式而异。它们记录在DataFrameReader API docs

例如:

  

ul

     

加载JSON文件(每行一个对象)并将结果作为DataFrame返回。

     

此函数通过输入一次以确定输入模式。如果您事先知道架构,请使用指定架构的版本以避免额外扫描。

     

您可以设置以下特定于JSON的选项来处理非标准JSON文件:

     
      
  • def json(paths: String*): DataFrame(默认primitivesAsString):将所有原始值推断为字符串类型
  •   
  • false(默认prefersDecimal):将所有浮点值推断为十进制类型。如果值不适合十进制,那么它将它们推断为双精度。
  •   
  • false(默认allowComments):忽略JSON记录中的Java / C ++样式注释
  •   
  • false(默认allowUnquotedFieldNames):允许不带引号的JSON字段名称
  •   
  • false(默认allowSingleQuotes):除双引号外还允许使用单引号
  •   
  • true(默认allowNumericLeadingZeros):允许数字前导零(例如00012)
  •   
  • false(默认allowBackslashEscapingAnyCharacter):允许使用反斜杠报价机制接受所有字符的引用
  •   
  • false(默认mode):允许在解析过程中处理损坏记录的模式。      
        
    • PERMISSIVE:在遇到损坏的记录时将其他字段设置为PERMISSIVE,并将格式错误的字符串放入由null配置的新字段中。当用户设置架构时,它会为额外字段设置columnNameOfCorruptRecord
    •   
    • null:忽略整个损坏的记录。
    •   
    • DROPMALFORMED:遇到损坏的记录时会抛出异常。
    •   
  •   
  • FAILFAST(默认值为columnNameOfCorruptRecord中指定的值):允许重命名具有spark.sql.columnNameOfCorruptRecord模式创建的格式错误字符串的新字段。这会覆盖PERMISSIVE
  •   

答案 1 :(得分:3)

Spark source code

  def option(key: String, value: String): DataFrameReader = {
    this.extraOptions += (key -> value)
    this
  }

其中extraOptions只是Map并且使用方式如下:

private def jdbc(
  url: String,
  table: String,
  parts: Array[Partition],
  connectionProperties: Properties): DataFrame = {
  val props = new Properties()
  // THIS
  extraOptions.foreach { case (key, value) =>
    props.put(key, value)
  }
  // connectionProperties should override settings in extraOptions
  props.putAll(connectionProperties)
  val relation = JDBCRelation(url, table, parts, props)(sqlContext)
  sqlContext.baseRelationToDataFrame(relation)
}

如您所见,它只是一种将附加属性传递给jdbc驱动程序的方法。

还有更通用的options方法来传递Map而不是单个键值及其在Spark documentation中的使用示例:

val jdbcDF = sqlContext.read.format("jdbc").options(
  Map("url" -> "jdbc:postgresql:dbserver",
  "dbtable" -> "schema.tablename")).load()

答案 2 :(得分:0)

sparkSession.read.option("header",true).parquet(fileKey)

在上述代码段中,Header = True表示:保留列标题。