来自SPARK中管道分隔文件的数据帧

时间:2016-08-17 17:46:47

标签: scala spark-dataframe

我是SPARK的新手所以试图做一个小程序并遇到下面的错误。 有人可以帮忙吗?

仅供参考 - 当示例文件的列中没有空数据时程序似乎有效,但问题似乎是由于第二行中的空值。

数据:TEMP_EMP.dat的内容

1232|JOHN|30|IT
1532|DAVE|50|
1542|JEN|25|QA

用于将此数据解析为数据框的SCALA代码

import org.apache.spark.sql.Row;
import org.apache.spark.sql.types.{StructType, StructField, StringType};
val employee = sc.textFile("file:///TEMP_EMP.dat")
val textFileTemp = sc.textFile("file:///TEMP_EMP.dat");
val schemaString = "ID|NAME|AGE|DEPT";
val schema = StructType(schemaString.split('|').map(fieldName=>StructField(fieldName,StringType,true)));
val rowRDD = employee.map(_.split('|')).map(e => Row(e(0),e(1),e(2), e(3) ));
val employeeDF = sqlContext.createDataFrame(rowRDD, schema);
employeeDF.registerTempTable("employee");
val allrecords = sqlContext.sql("SELECT * FROM employee");
allrecords.show();

错误日志:

  

WARN 2016-08-17 13:36:21,006 org.apache.spark.scheduler.TaskSetManager:阶段6.0中丢失的任务0.0:java.lang.ArrayIndexOutOfBoundsException:3

2 个答案:

答案 0 :(得分:0)

这一行:

val rowRDD = employee.map(_.split('|')).map(e => Row(e(0),e(1),e(2), e(3) ));

您假设employee.map(_.split('|'))的结果至少有四个元素,但第二行只有3个,因此索引超出范围异常。

举例说明:

scala> val oneRow = "1532|DAVE|50|".split('|')
oneRow: Array[String] = Array(1532, DAVE, 50)

scala> oneRow(3)
java.lang.ArrayIndexOutOfBoundsException: 3

答案 1 :(得分:0)

我们应该如何分割它:

val schema = StructType(
                schemaString
                   .split("|",-1)
                   .map( fieldName => StructField(fieldName,StringType,true) )
             );

val rowRDD = employee
                .map( _.split("|", -1) )
                .map( e => Row(e(0),e(1),e(2),e(3)) );