无法使用spark shell在hdfs中创建Parquet文件

y53ybaqx  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(343)

我想在hdfs中创建parquet文件,然后作为外部表通过配置单元读取它。在写Parquet文件时,我被sparkshell中的舞台失败所震撼。
spark版本:1.5.2 scala版本:2.10.4 java:1.7
输入文件:(employee.txt)
1201,萨蒂什,25岁
1202年,克里希纳,28岁
1203,阿米特,39岁
1204,贾韦德,23岁
1205,普鲁德维,23岁
Spark壳内:

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")

当我键入最后一个命令时,
错误
spark应用程序管理器
我甚至尝试增加执行器内存,但仍然失败。同样重要的是,finaldf.show()会产生相同的错误。所以,我想我犯了一个逻辑错误。
谢谢你的支持

b5buobof

b5buobof1#

这里的问题是您正在创建一个所有字段/列类型都默认为stringtype的模式。但是在传递模式中的值时,id和age的值将根据代码转换为整数。因此,在运行时抛出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")

这段代码应该运行良好。

相关问题