Scala 无法使用spark shell在hdfs中创建拼花文件

Scala 无法使用spark shell在hdfs中创建拼花文件,scala,hadoop,apache-spark,parquet,Scala,Hadoop,Apache Spark,Parquet,我想在hdfs中创建拼花地板文件,然后将其作为外部表通过配置单元读取。在编写拼花文件时,我对spark shell中的舞台失败感到震惊 Spark版本:1.5.2 Scala版本:2.10.4 Java:1.7 输入文件:(employee.txt) 1201,萨蒂什,25 1202年,克里希纳,28 1203,阿米斯,39 1204年,贾韦德,23岁 1205年,普鲁德维,23岁 在火花壳中: val sqlContext = new org.apache.spark.sql.SQLConte

我想在hdfs中创建拼花地板文件,然后将其作为外部表通过配置单元读取。在编写拼花文件时,我对spark shell中的舞台失败感到震惊

Spark版本:1.5.2 Scala版本:2.10.4 Java:1.7

输入文件:(employee.txt)

1201,萨蒂什,25
1202年,克里希纳,28
1203,阿米斯,39
1204年,贾韦德,23岁
1205年,普鲁德维,23岁

在火花壳中:

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc)
val employee = sc.textFile("employee.txt")
employee.first()
val schemaString = "id name age"
import org.apache.spark.sql.Row;
import org.apache.spark.sql.types.{StructType, StructField, StringType};
val schema = StructType(schemaString.split(" ").map(fieldName ⇒ StructField(fieldName, StringType, true)))
val rowRDD = employee.map(_.split(",")).map(e ⇒ Row(e(0).trim.toInt, e(1), e(2).trim.toInt))
val employeeDF = sqlContext.createDataFrame(rowRDD, schema)
val finalDF = employeeDF.toDF();
sqlContext.setConf("spark.sql.parquet.compression.codec", "snappy")
var WriteParquet= finalDF.write.parquet("/user/myname/schemaParquet")
当我键入最后一个命令时

我甚至尝试增加执行器内存,但仍然失败。 同样重要的是,finalDF.show()会产生相同的错误。 所以,我认为我在这里犯了一个逻辑错误


感谢您的支持

这里的问题是您正在创建一个架构,其中所有字段/列类型默认为StringType。但是在传递模式中的值时,IdAge的值将根据代码转换为整数。因此,在运行时抛出Matcherror

架构中列的数据类型应与传递给它的值的数据类型相匹配。请尝试下面的代码

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc)
val employee = sc.textFile("employee.txt")
employee.first()
//val schemaString = "id name age"
import org.apache.spark.sql.Row;
import org.apache.spark.sql.types._;
val schema = StructType(StructField("id", IntegerType, true) :: StructField("name", StringType, true) :: StructField("age", IntegerType, true) :: Nil)
val rowRDD = employee.map(_.split(" ")).map(e ⇒ Row(e(0).trim.toInt, e(1), e(2).trim.toInt))
val employeeDF = sqlContext.createDataFrame(rowRDD, schema)
val finalDF = employeeDF.toDF();
sqlContext.setConf("spark.sql.parquet.compression.codec", "snappy")
var WriteParquet= finalDF.write.parquet("/user/myname/schemaParquet")

这段代码应该可以正常运行。

这里的问题是您正在创建一个架构,其中所有字段/列类型默认为StringType。但是在传递模式中的值时,IdAge的值将根据代码转换为整数。因此,在运行时抛出Matcherror

架构中列的数据类型应与传递给它的值的数据类型相匹配。请尝试下面的代码

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc)
val employee = sc.textFile("employee.txt")
employee.first()
//val schemaString = "id name age"
import org.apache.spark.sql.Row;
import org.apache.spark.sql.types._;
val schema = StructType(StructField("id", IntegerType, true) :: StructField("name", StringType, true) :: StructField("age", IntegerType, true) :: Nil)
val rowRDD = employee.map(_.split(" ")).map(e ⇒ Row(e(0).trim.toInt, e(1), e(2).trim.toInt))
val employeeDF = sqlContext.createDataFrame(rowRDD, schema)
val finalDF = employeeDF.toDF();
sqlContext.setConf("spark.sql.parquet.compression.codec", "snappy")
var WriteParquet= finalDF.write.parquet("/user/myname/schemaParquet")

这段代码应该运行得很好。

感谢您的回复,它工作得很好,这里有一个小错误,应该是//val rowRDD=employee.map(u.split(“,”)).map(e⇒ 行(e(0).trim.toInt,e(1),e(2).trim.toInt))//您漏掉了一个逗号,但非常感谢您的帮助。不客气。实际上,我在测试时正在处理一个用空格分隔的文本文件。因此,遗漏了逗号。感谢您指出:)另外,它报告值拆分不是我的类包的成员,当我在IntelliJ IDE中尝试整个过程时,报告应用程序不接受任何参数。您知道我需要添加什么依赖项吗?您使用的是sbt还是Maven?我能够用Maven在Eclipse中运行相同的代码。将以下依赖项添加到pom.xml`org.apache.spark spark-core_2.11 1.6.1 org.apache.spark spark-sql_2.11 1.6.1`您能粘贴错误消息和sbt/pom.xml文件吗?感谢您的回复,它工作正常,这里有一个小错误,它应该是//val rowRDD=employee.map(u.split(“,”).map(e⇒ 行(e(0).trim.toInt,e(1),e(2).trim.toInt))//您漏掉了一个逗号,但非常感谢您的帮助。不客气。实际上,我在测试时正在处理一个用空格分隔的文本文件。因此,遗漏了逗号。感谢您指出:)另外,它报告值拆分不是我的类包的成员,当我在IntelliJ IDE中尝试整个过程时,报告应用程序不接受任何参数。您知道我需要添加什么依赖项吗?您使用的是sbt还是Maven?我能够用Maven在Eclipse中运行相同的代码。将以下依赖项添加到pom.xml`org.apache.spark spark-core_2.11 1.6.1 org.apache.spark spark-sql_2.11 1.6.1`是否可以粘贴错误消息和sbt/pom.xml文件?