Spark阅读压缩特殊格式

时间:2016-09-18 17:52:28

标签: scala apache-spark spark-dataframe bigdata

我有一个文件.gz我需要读取此文件并将时间和文件名添加到此文件中我遇到了一些问题,需要您的帮助来推荐一种解决此问题的方法。

  1. 因为文件是压缩的,所以第一行读取的格式不正确我认为由于编码问题,我尝试了下面的代码但没有工作

    implicit val codec = Codec("UTF-8")
    codec.onMalformedInput(CodingErrorAction.REPLACE)
    codec.onUnmappableCharacter(CodingErrorAction.REPLACE)
    
  2. 文件有特殊格式,我需要使用Regex将其读入datafame ==>我找到的唯一方法是使用RDD读取它并将其映射到正则表达式是否有任何方法可以直接将其读取到DF并传递正则表达式?

    val Test_special_format_RawData = sc.textFile("file://"+filename.toString())
      .map(line ⇒ line.replace("||", "|NA|NA"))
      .map(line ⇒ if (line.takeRight(1) == "|") line+"NA" else line)
      .map { x ⇒ regex_var.findAllIn(x).toArray }
    
    import hiveSqlContext.implicits._
    
    val Test_special_format_DF = Test_special_format_RawData.filter { x⇒x.length==30 }
      .filter { x⇒x(0) !=header(0) }
      .map { x⇒ (x(0), x(1), x(2), x(3), x(4), x(5), x(6), x(7),
                 x(8), x(9), x(10), x(11), x(12), x(13), x(14),
                 x(15),x(16), x(17), x(18), x(19))}.toDF()
    
    val Test_special_format_Tranformed_Data = Test_special_format_DF.withColumn("FileName", lit(filename.getName))
      .withColumn("rtm_insertion_date", lit(RTM_DATE_FORMAT.format(Cal.getInstance().getTime())))
    
  3. 我可以忽略任何特殊字符之间的任何分隔符,例如“|”管道来之间^〜^〜忽略了吗?

  4. 有时数据帧列类型由错误的数据类型接收。我们如何处理此问题以应用数据质量检查?

  5. 当我尝试使用Dataframe从Spark插入hive时。我可以为un handle rows指定拒绝目录错误下面是我使用的代码吗?

    Test_special_format_Tranformed_Data.write.partitionBy("rtm_insertion_date")
      .mode(SaveMode.Append).insertInto("dpi_Test_special_format_source")
    
  6. 该文件的样本为here

1 个答案:

答案 0 :(得分:2)

我将回答有关文件格式问题的问题。解决方案是覆盖gzib的默认扩展名格式。

import org.apache.hadoop.io.compress.GzipCodec

class TmpGzipCodec extends GzipCodec {

  override def getDefaultExtension(): String = ".gz.tmp"

}

现在我们刚刚注册了此编解码器,并在SparkConf上设置了spark.hadoop.io.compression.codecs:

val conf = new SparkConf()

// Custom Codec that process .gz.tmp extensions as a common Gzip format
conf.set("spark.hadoop.io.compression.codecs", "smx.ananke.spark.util.codecs.TmpGzipCodec")

val sc = new SparkContext(conf)

val data = sc.textFile("s3n://my-data-bucket/2015/09/21/13/*")

我发现此解决方案是link

关于格式错误的记录,有以下两种解决方法:

  1. 将案例作为案例类,然后检查其模式是否与此案例类匹配。
  2. 逐行解析RDD,但需要在spark.csv库中进行更新。

关于分隔符分隔符问题,它要求将RDD与正则表达式一起使用。

相关问题