Databricks镶木地板转换

时间:2017-07-24 18:44:37

标签: scala apache-spark parquet databricks

我正在使用数据库进行镶木地板转换。该文件是^ A分隔。我在创建DF时明确提到了这一点,如下所示。但是当我在数据中得到一个^ M字符时,它终止于那里并给出格式错误的行异常。有人可以建议我如何处理这个问题?

记录中的样本部分
  推出^ Asome文本来到这里; ^ M ^ M奖励:更多文本; ^ A0.00

val dataframe = sparkSession.sqlContext.read
                    .format("com.databricks.spark.csv")
                    .option("delimiter", "\U0001")
                    .option("header", "false")
                    .option("mode","FAILFAST")
                    .option("treatEmptyValuesAsNulls","true")
                    .option("nullValue"," ")
                    .option("quote","")
                    .option("ignoreLeadingWhiteSpace", "true")
                    .option("ignoreTrailingWhiteSpace", "true")
                    .schema(schema)
                    .load(fileLocation)

错误 FAILFAST模式中格式错误的行:Rollout ^ Asome文本来到这里;

1 个答案:

答案 0 :(得分:1)

您也可以使用dataframe获取sparkContext,如下所示

val dataframe = sparkSession.sparkContext.textFile(fileLocation).map(line => line.split("\\^A")).map(array => (array(0).trim, array(1).trim, array(2).trim)).toDF

dataframe.show(false)

输出

+-------+-------------------------------------------------+----+
|_1     |_2                                               |_3  |
+-------+-------------------------------------------------+----+
|Rollout|some text comes here;^M ^M Rewards:somemore text;|0.00|
+-------+-------------------------------------------------+----+

<强>更新

您已发表评论

  
    

但我们正在构建一个处理1000多个表的通用框架,我们正在寻找更通用的解决方案

  

为此,您可以创建架构使用该架构来创建数据框。我试图制作尽可能多的通用

//read the file
val rdd = sc.textFile(fileLocation).map(line => line.split("\\^A"))
//create schema
val schema = StructType(rdd.first().indices.map(x => StructField("col_"+(x+1), StringType)))

//create dataframe
sqlContext.createDataFrame(rdd.map(Row.fromSeq(_)), schema).show(false)

应该给你

+-------+-------------------------------------------------+-----+
|col_1  |col_2                                            |col_3|
+-------+-------------------------------------------------+-----+
|Rollout|some text comes here;^M ^M Rewards:somemore text;|0.00 |
+-------+-------------------------------------------------+-----+

现在列数取决于数据中^A的数量

我希望答案很有帮助