繁体   English   中英

无法使用Spark Shell在HDFS中创建Parquet文件

[英]Not able to create parquet files in hdfs using spark shell

我想在hdfs中创建实木复合地板文件,然后通过蜂巢将其读取为外部表。 编写镶木地板文件时,我因火花壳中的舞台故障而感到震惊。

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

输入文件:(employee.txt)

1201,satish,25
1202,克里希纳,28
1203,amith,39
1204,熟,23
1205,prudvi,23

在Spark-Shell中:

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()会产生相同的错误。 因此,我相信我在这里犯了一个逻辑错误。

感谢您的支持

这里的问题是您正在使用所有字段/列类型默认设置为StringType的方式创建架构。 但是当在模式中传递值时, IdAge的值将根据代码转换为Integer,因此在运行时会抛出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")

此代码应运行正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM