Apache Spark是否处理非结构化多行数据?

时间:2016-06-01 15:10:12

标签: apache-spark

数据如下:

make,Model,MPG,Cylinders,Engine Disp,Horsepower,Weight,Accelerate,Year,Origin<br>
amc,amc ambassador dpl,15,8,390,190,3850,8.5,70,Indian<br>
amc,amc gremlin,21,6,199,90,2648,15,70,Indian<br>
amc,amc hornet,18,6,199,97,2774,15.5,70,Indian<br>
amc,amc rebel sst,16,8,304,150,3433,12,70,Indian<br>
.............
.............
.............

现在上面是一个纯粹的结构化数据,我用scala快速处理了spark,如下所示

val rawData=sc.textFile("/hdfs/spark/cars2.txt") <br>
case class cars(make:String, model:String, mpg:Integer, cylinders :Integer, engine_disp:Integer, horsepower:Integer,weight:Integer ,accelerate:Double,  year:Integer, origin:String)<br>
val carsData=rawData.map(x=>x.split(",")).map(x=>cars(x(0).toString,x(1).toString,x(2).toInt,x(3).toInt,x(4).toInt,x(5).toInt,x(6).toInt,x(7).toDouble,x(8).toInt,x(9).toString))<br>
carsData.take(2)<br>
carsData.cache()<br>
carsData.map(x=>(x.origin,1)).reduceByKey((x,y)=>x+y).collect<br>
val indianCars=carsData.filter(x=>(x.origin=="Indian"))<br>
indianCars.count() <br>
val makeWeightSum=indianCars.map(x=>(x.make,x.weight.toInt)).combineByKey((x:Int) => (x, 1),(acc:(Int, Int), x) => (acc._1 + x, acc._2 +  1),(acc1:(Int, Int), acc2:(Int, Int)) => (acc1._1 + acc2._1, acc1._2 + acc2._2))<br>
makeWeightSum.collect()<br>
val makeWeightAvg=makeWeightSum.map(x=>(x._1,(x._2._1/x._2._2)))<br>
makeWeightAvg.collect()<br>
makeWeightAvg.saveAsTextFile(“carsMakeWeightAvg.txt”)<br>

现在我也可以在HIVE中做这个分析,为什么我需要火花(Spark可能很快,谁真的想在ROCKET上旅行)。所以问题是,SPARK是否处理多行非结构化数据,如下所示: 数据:

Brand:Nokia, Model:1112, price:100, time:201604091,<br>
redirectDomain:xyz.com, type:online,status:completed,<br>
tx:credit,country:in,<br>

Brand:samsung, Model:s6, price:5000, time:2016045859,<br>
redirectDomain:abc.com, type:online,status:completed,<br>

.....thousands of records...

2 个答案:

答案 0 :(得分:2)

是的,Spark应该用来做那件事。

DataFrame是组织到命名列中的分布式数据集合。 Spark SQL支持通过DataFrame interface对各种数据源进行操作。 您可以Manually Specify Options获取此类数据的数据来源。

参考:Spark DataFramesmutli-line input in spark

注意:您的数据不是非结构化的。它更像是一个csv文件,如果你执行一些基本的转换,它可能会转换为数据集/数据框。

如果您只是测试可用于执行此操作的各种可能的工具/框架,我还建议您Apache Flink

答案 1 :(得分:1)

Spark通常每行读取一行。因此,您的rawData.map将按&#34;,&#34; 分割每个文本行。因此,非结构化多行数据将失败。

如果您有多行CSV,则需要同时读取所有文件并实现自己的CSV解析器,以便处理多行。

Learning Spark预订来自O&#39;真正实现以下方法:

val input = sc.wholeTextFiles(inputFile)
val result = input.flatMap{ case (_, txt) =>
    val reader = new CSVReader(new StringReader(txt));
    reader.readAll().map(x => IndianCar(x(0), x(1), ...)))
}
相关问题