Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在Spark中读取字段中有换行符(\n)的文件,用反斜杠(\)转义,不带引号_Scala_Apache Spark_Amazon Emr_Spark Csv - Fatal编程技术网

Scala 在Spark中读取字段中有换行符(\n)的文件,用反斜杠(\)转义,不带引号

Scala 在Spark中读取字段中有换行符(\n)的文件,用反斜杠(\)转义,不带引号,scala,apache-spark,amazon-emr,spark-csv,Scala,Apache Spark,Amazon Emr,Spark Csv,我有一个具有以下结构的输入文件 col1, col2, col3 line1filed1,line1filed2.1\ line1filed2.2, line1filed3 line2filed1,line2filed2.1\ line2filed2.2, line2filed3 line3filed1, line3filed2, line3filed3 line4filed1,l

我有一个具有以下结构的输入文件

    col1, col2, col3
    
    line1filed1,line1filed2.1\
    
    line1filed2.2, line1filed3
    
    line2filed1,line2filed2.1\
    
    line2filed2.2, line2filed3
    
    line3filed1, line3filed2, line3filed3
    
    line4filed1,line4filed2,
    
    line5filed1,,line5filed3
输出数据帧必须是

    col1, col2, col3
    
    [line1filed1,line1filed2.1 line1filed2.2, line1filed3]
    
    [line2filed1,line2filed2.1 line2filed2.2, line2filed3]
    
    [line3filed1, line3filed2, line3filed3]
    
    [line4filed1,line4filed2, null]
    
    [line5filed1, null, line5filed3]
我正在努力

spark
阅读
.选项(“多行”、“真”)
.选项(“转义”,“\\”)
.csv(“文件路径”)
一些解决方案建议使用
wholeTextFiles
,但也提到
wholeTextFiles
不是最佳解决方案

这样做的正确方式是什么


p.S:我确实有一个输入生产文件
50GB

我试过这段代码

我认为它可以改进,但也许它可以给你一些线索来解决你的问题

import org.apache.log4j.{Level,Logger}
导入org.apache.spark.sql.SparkSession
/**
*col1,col2,col3
*[第1行文件1、第1行文件2.1、第1行文件2.2、第1行文件3]
*[line2filed1、line2filed2.1、line2filed2.2、line2filed3]
*[line3filed1、line3filed2、line3filed3]
*[line4filed1,line4filed2,null]
*[line5filed1,null,line5filed3]
*/
对象多行2{
val spark=火花会话
.builder()
.appName(“多行2”)
.master(“本地[*]”)
.config(“spark.sql.shuffle.partitions”,“4”)//将数据更改为更合理的默认分区数
.config(“spark.app.id”,“multile2”)//使度量警告静音
.getOrCreate()
val sc=spark.sparkContext
val input=“/home/cloudera/files/tests/multile2.csv”
def main(参数:数组[字符串]):单位={
试一试{
Logger.getRootLogger.setLevel(Level.ERROR)
val数据=sc.textFile(输入)
val header=data.first()
val columns=标题。拆分(“,”)
导入spark.implicits_
var aux=“”
val multiline=数据
.filter(line=>!line.equals(标题))
.map(行=>{
如果(第行包含(\”){
aux=line.substring(0,line.lastIndexOf(“\”))
""
}否则{
val l=s“$aux$行”
aux=“”
L
}
})
.filter(line=>!line.equals(“”)
.map(line=>line.split(“,”))
.map(r=>{r.length匹配{
案例2=>(r(0.trim,r(1.trim)”)
(r(0)修剪,r(1)修剪,r(2)修剪)
}})
.toDF(列(0).修剪,列(1).修剪,列(2).修剪)
multiline.show()
//要有机会查看Spark的web控制台:http://localhost:4040/
println(“在控制台中键入要退出的内容……”)
scala.io.StdIn.readLine()
}最后{
sc.停止()
println(“SparkContext已停止”)
spark.stop()
println(“SparkSession已停止”)
}
}
}
+-----------+--------------------+-----------+
|col1 | col2 | col3|
+-----------+--------------------+-----------+
|第1行文件1 |第1行文件2.1林.|第1行文件3|
|Line2文件1 | Line2文件2.1 lin.| Line2文件3|
|line3filed1 | line3filed2 | line3filed3|
|line4filed1 | line4filed2 ||
|第5行文件1 | |第5行文件3|
+-----------+--------------------+-----------+