Spark:使用标题读取CSV文件

时间:2015-04-15 16:04:21

标签: csv apache-spark apache-spark-mllib

我有一个包含90列和大约28000行的CSV文件。

我想加载它并将其拆分为火车(75%)和测试(25%)。我使用了以下代码:

代码:

val data = sc.textFile(datadir + "/dados_frontwave_corte_pedra_ferramenta.csv")
        .map(line => line.split(","))
            .filter(line => line.length>1)
        .collect();

// Building the model
val numIterations = 20;
val model = LinearRegressionWithSGD.train(data, numIterations);

我在“数据”上收到以下错误:

type mismatch; found : Array[Array[String]] required: org.apache.spark.rdd.RDD[org.apache.spark.mllib.regression.LabeledPoint]

有什么问题?我在互联网上搜索它,我找不到任何明确的答案。

我找到了这个Spark Example并将我的代码更改为:

val data = sc.textFile(datadir + "/dados_frontwave_corte_pedra_ferramenta.csv")
val parsedData = data.map {line =>
    val parts = line.split(",")
    LabeledPoint(parts(0).toDouble, Vectors.dense(parts(1).split(",").map(x => x.toDouble).toArray))
    };

错误已经消失但是当我运行代码时会产生以下错误:

15/04/15 16:53:52 ERROR Executor: Exception in task 1.0 in stage 0.0 (TID 1)
java.lang.NumberFormatException: For input string ""12316""
at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
at scala.collection.immutable.StringLinke$class.toDouble(StringOps.scala:31)
....

输入文件示例:

"","Ferramenta","Pedra","ensaio","Nrasgo","Vcorte","Vrotacional","PCorte","Tempo","Fh","Fr","Energia","Caudal","Vib_disco","Vib_maquina","xx","yy","zz","Fonte","id","rocha_classe","rocha_tipo","Resistência_mecânica_à_compressão","Res._mec._à_compr._após_teste_de_gelividade","Resistência_mecânica_à_flexão","Massa_volúmica_aparente","Absorção_de_água_à_P._At.N.","Porosidade_aberta","Coef._de_dilatação_linear_térmica_val._máx","Resistência_ao_desgaste","Resistência_ao_choque_altura_minima_de_queda","Resistência_ao_gelo","Al2O3","CaO","H2O.","K2O","MgO","MnO","Na2O","P2O5","SiO2","TiO2","microclina","plagioclase","quartzo","page_id","rocha_nome_2","P.R._.L.O.I..","plagioclase_.oligoclase.albite.","feldspato_potássico_.microclina.","feldspato_potássico_.essencialmente_microclina.","biotite","rocha_nome_3","oligoclase","plagioclase_.andesina.","horneblenda","feldspato_potássico","nefelina","aegirina_e_aegirina.augite","esfena","piroxena","olivina","horneblenda_verde","plagioclase_.oligoclase.","CO2","clorite","cloritóide","quartzo.feldspato","SO3","cloritóide.clorite","calcite","dolomite","serpentina_.antigorite.crisótilo.","mica_.biotite.moscovite.","feldspato","Fe2O3","plagioclase_ácida","cristobalite","rocha_nome_1","Ferramentas","Binder","LM","graf","WC","T","sigma","epsilon","m","E","H"
"1","A-010-13","estremoz","ECE-E1",5,26,1430,5,6.08,-0.0981,57,720,23.5,0.9,3.5,162,197.2,5,"ECE-A-010-13-Estremoz_1",2,"sedimentares ","calcário",960,767,276,2711,0.07,0.18,11.5,3.4,57.5,48,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"A-010/13","A-038/11","LM 156",0,0,800,425,0.0062,1.09,159,2085
"2","A-010-13","estremoz","ECE-E1",5,26,1430,5,5.9,-0.0981,63,720,23.5,0.9,3.5,157,197.2,5,"ECE-A-010-13-Estremoz_1",2,"sedimentares ","calcário",960,767,276,2711,0.07,0.18,11.5,3.4,57.5,48,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"A-010/13","A-038/11","LM 156",0,0,800,425,0.0062,1.09,159,2085

2 个答案:

答案 0 :(得分:1)

在您的第一个示例中,方法collect需要RDD并且您将其传递给Array。

collect是一项不是转型的行动。删除对val data = sc.textFile(datadir + "/dados_frontwave_corte_pedra_ferramenta.csv") .map(line => line.split(",")) .filter(line => line.length>1); // Building the model val numIterations = 20; val model = LinearRegressionWithSGD.train(data, numIterations); 的来电可以解决您的问题。

这应该有效

photo

答案 1 :(得分:0)

也许这是一个奇怪的解决方案,但试试这个:

val parts = line.split(",").map(x => x.replace("\"", "")).filter(x => x.length > 0)