我正在尝试使用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
哪里可能是问题?
答案 0 :(得分:1)
在为几个文本文件尝试相同的代码之后,我实际上已经纠正了文本文件中的文本格式,无论如何。
以下代码中的列分隔符为“,”,在我仔细扫描后,它在文本文件中的1个位置丢失。
val y = x.map(x=>x.split(",")).map(x=>rec(x(0).toInt,x(1),x(2)))
代码运行正常,并在更改后以结构化表格格式给出了结果。
因此,重要的是要注意内部给出的分隔符(“,”,“\ t”,“|”)
x.split("")
应与源文件和整个源文件中的相同。