无法使用案例类

时间:2017-05-19 20:25:37

标签: scala apache-spark

我正在尝试使用Case Class将rdd转换为DataFrame,如下所示

1.)从具有" id,name,country"的文本文件中获取数据。由",#34;但没有标题

val x = sc.textFile("file:///home/hdadmin/records.txt")

2.)创建一个案例类" rec"标题定义如下:

case class rec(id:Int, name:String, country:String)

3.)现在我定义转换

val y = x.map(x=>x.split(",")).map(x=>rec(x(0).toInt,x(1),x(2)))

4.)然后我导入了implicits库

import spark.implicits._

5.使用toDF方法将rdd转换为数据帧:

val z = y.toDF()

6。)现在,当我尝试使用以下命令获取记录时:

z.select("name").show()

我收到以下错误:

  

17/05/19 12:50:14错误LiveListenerBus:SparkListenerBus已经   停!删除事件SparkListenerSQLExecutionStart(9,显示于   :49,org.apache.spark.sql.Dataset.show(Dataset.scala:495)   $ line105。$读$$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW。(49)   $ line105。$读$$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW (54)   $ line105 $读$$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW(。: 56)   $ line105 $读$$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW。(58)   $ line105 $读$$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW。(60)   $ line105 $读$$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW。(62)   $ line105。$ read $$ iw $$ iw $$ iw $$ iw $$ iw $$ iw $$ iw $$ iw $$ iw $$ iw。(:64)$ line105。$ read $$ iw $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW。(66)   。$ line105 $读$$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW。(68)   。$ line105 $读$$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW。(70)   。$ $ line105读$$ IW $$ IW $$ IW $$ IW $$ IW $$ IW。(72)   。$ line105 $读$$ IW $$ IW $$ IW $$ IW $$ IW。(74)   。$ line105 $读$$ IW $$ IW $$ IW $$ IW。(76)   。$ line105 $读$$ IW $$ IW $$ IW。(78)   。$ line105 $读$$ IW $$ IW。(80)   $ line105 $读$$ IW。(82)   $ line105 $读。(84)   。$ line105 $读$(88)   $ line105。$ read $。(),== Parsed Logical Plan ==   GlobalLimit 21   + - LocalLimit 21 + - 项目[名称#91]         + - LogicalRDD [id#90,名称#91,国家#92]

     

==分析逻辑计划==名称:字符串GlobalLimit 21   + - LocalLimit 21 + - 项目[名称#91]         + - LogicalRDD [id#90,名称#91,国家#92]

     

==优化逻辑计划== GlobalLimit 21   + - LocalLimit 21 + - 项目[名称#91]         + - LogicalRDD [id#90,名称#91,国家#92]

     

==物理计划== CollectLimit 21   + - *项目[名称#91] + - 扫描ExistingRDD [id#90,名称#91,国家#92],org.apache.spark.sql.execution.SparkPlanInfo @ b807ee,1495223414636)   17/05/19 12:50:14错误LiveListenerBus:SparkListenerBus已经存在   停!删除事件SparkListenerSQLExecutionEnd(9,1495223414734)   java.lang.IllegalStateException:SparkContext已关闭   org.apache.spark.SparkContext.runJob(SparkContext.scala:1863)at at   org.apache.spark.SparkContext.runJob(SparkContext.scala:1884)at at   org.apache.spark.SparkContext.runJob(SparkContext.scala:1897)at at   org.apache.spark.sql.execution.SparkPlan.executeTake(SparkPlan.scala:347)   在   org.apache.spark.sql.execution.CollectLimitExec.executeCollect(limit.scala:39)   在   org.apache.spark.sql.Dataset $$ anonfun $ $组织阿帕奇$火花$ SQL $数据集$$执行$ 1 $ 1.适用(Dataset.scala:2183)   在   org.apache.spark.sql.execution.SQLExecution $ .withNewExecutionId(SQLExecution.scala:57)   at org.apache.spark.sql.Dataset.withNewExecutionId(Dataset.scala:2532)   在   org.apache.spark.sql.Dataset.org $阿帕奇$火花$ SQL $数据集$$执行$ 1(Dataset.scala:2182)   在   org.apache.spark.sql.Dataset.org $阿帕奇$火花$ SQL $数据集$$收集(Dataset.scala:2189)   在   org.apache.spark.sql.Dataset $$ anonfun $头$ ​​1.适用(Dataset.scala:1925)   在   org.apache.spark.sql.Dataset $$ anonfun $头$ ​​1.适用(Dataset.scala:1924)   at org.apache.spark.sql.Dataset.withTypedCallback(Dataset.scala:2562)   在org.apache.spark.sql.Dataset.head(Dataset.scala:1924)at   org.apache.spark.sql.Dataset.take(Dataset.scala:2139)at   org.apache.spark.sql.Dataset.showString(Dataset.scala:239)at at   org.apache.spark.sql.Dataset.show(Dataset.scala:526)at at   org.apache.spark.sql.Dataset.show(Dataset.scala:486)at at   org.apache.spark.sql.Dataset.show(Dataset.scala:495)... 56 elided

哪里可能是问题?

1 个答案:

答案 0 :(得分:1)

在为几个文本文件尝试相同的代码之后,我实际上已经纠正了文本文件中的文本格式,无论如何。

以下代码中的列分隔符为“,”,在我仔细扫描后,它在文本文件中的1个位置丢失。

val y = x.map(x=>x.split(",")).map(x=>rec(x(0).toInt,x(1),x(2)))

代码运行正常,并在更改后以结构化表格格式给出了结果。

因此,重要的是要注意内部给出的分隔符​​(“,”,“\ t”,“|”)

x.split("")

应与源文件和整个源文件中的相同。