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

标签 scala hadoop apache-spark parquet

我想在 hdfs 中创建 parquet 文件,然后通过 hive 将其作为外部表读取。在编写 Parquet 文件时,我对 spark-shell 中的阶段失败感到震惊。

星火版本:1.5.2 斯卡拉版本:2.10.4 Java:1.7

输入文件:(employee.txt)

1201,萨蒂什,25岁
1202,克里希纳,28岁
1203,阿米斯,39岁
1204,贾韦德,23
1205,普鲁德维,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")

当我输入最后一条命令时,

ERROR

SPARK APPLICATION MANAGER

我什至尝试增加执行程序内存,但仍然失败。 同样重要的是,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")

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

关于scala - 无法使用 spark shell 在 hdfs 中创建 Parquet 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37686601/

相关文章:

scala - 延迟 val 解析的优雅方式

Scala foreach 成员变量

scala - 找不到参数e的隐式值

Hadoop心跳和 block 报告时间间隔

scala - 如何在Dataframe上使用Spark中DataFrameNaFunctions类提供的函数?

scala - Spark 数据帧到嵌套映射

用于桌面的 Scala

java - Add() 与 addAll() 插入 Java 优先堆

hadoop - 如何找到安装了hadoop的节点总数

hadoop - Spark 1.6.Token只能通过kerberos或web认证方式下发