我正在使用数据库进行镶木地板转换。该文件是^ 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文本来到这里;
答案 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
的数量
我希望答案很有帮助