我想读书 orders
数据并从中创建rdd,rdd存储为 sequence
hadoop fs中的文件
cloudera vm
. 以下是我的步骤:
1) 将订单数据作为序列文件导入:
sqoop import --connect jdbc:mysql://localhost/retail_db --username retail_dba --password cloudera --table orders -m 1 --target-dir /ordersDataSet --as-sequencefile
2) 正在spark scala中读取文件:
Spark1.6
val sequenceData=sc.sequenceFile("/ordersDataSet",classOf[org.apache.hadoop.io.Text],classOf[org.apache.hadoop.io.Text]).map(rec => rec.toString())
3) 当我试图从上面的rdd读取数据时,它会抛出以下错误:
Caused by: java.io.IOException: WritableName can't load class: orders
at org.apache.hadoop.io.WritableName.getClass(WritableName.java:77)
at org.apache.hadoop.io.SequenceFile$Reader.getValueClass(SequenceFile.java:2108)
... 17 more
Caused by: java.lang.ClassNotFoundException: Class orders not found
at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2185)
at org.apache.hadoop.io.WritableName.getClass(WritableName.java:75)
... 18 more
我不知道为什么上面说找不到订单。我哪里出错了?
我也引用了这两个链接的代码,但运气不好:
1) 参考序列部分
2) 参见第8步
2条答案
按热度按时间pw9qyyiw1#
sqoop与此几乎没有关系,下面是一个更现实的场景示例,其中saveassequencefile始终假定k,v对-这可能会帮助您:
退货:
我不确定您是否需要rdd或df,但是将rdd转换为df当然是微不足道的。
x0fgdtte2#
我想出了解决自己问题的办法。好吧,我将写一个冗长的解决方案,但我希望它会有一些意义。
1) 当我试图读取导入的数据时
HDFS
使用SQOOP
,它给出了一个错误,原因如下:a) 序列文件是关于
key-value pair
. 因此,当我使用sqoop导入它时,导入的数据不在键值对中,这就是为什么在读取时抛出错误的原因。b) 如果你想读书
few characters
你可以从中找出two classes
读取序列文件时作为输入传递所需的数据如下:上面你只能看到
one class
即org.apache.hadoop.io.LongWritable
当我在读取序列数据时传递它时,它抛出了一个错误,这在后面提到过。我不认为
B
这一点是错误的主要原因,但我非常肯定A
这一点才是那个错误的真正罪魁祸首。2) 下面是我解决问题的方法。
我导入了数据作为
avro
data
在其他目标中使用SQOOP
. 然后我使用以下方法从avro创建了Dataframe:现在我创造了
key-value pair
并将其另存为sequence
文件现在当我试着阅读的时候
few
上面写的文件的字符它给我two classes
我在阅读以下文件时需要:现在,当我尝试打印数据时,它会显示如下数据:
最后,感谢大家的努力。干杯!!