Я разобрался с решением своей проблемы. Ну, я собираюсь написать длинное решение, но я надеюсь, что оно будет иметь некоторый смысл.
1) Когда я пытался прочитать данные, которые были импортированы в HDFS
с использованием SQOOP
, выдает ошибку по следующим причинам:
A) Файл последовательности - все о key-value pair
. Поэтому, когда я импортирую его с помощью sqoop, импортируемые данные находятся не в паре ключ-значение, поэтому при чтении выдает ошибку.
Б) Если вы попытаетесь прочитать few characters
, из которого вы сможете определить two classes
, необходимый для передачи в качестве ввода при чтении файла последовательности, вы получите данные, как показано ниже:
[cloudera@quickstart ~]$ hadoop fs -cat /user/cloudera/problem5/sequence/pa* | head -c 300
SEQ!org.apache.hadoop.io.LongWritableorders�;�M��c�K�����@���-OCLOSED@���PENDING_PAYMENT@���/COMPLETE@���"{CLOSED@���cat: Unable to write to output stream.
Выше вы можете видеть только one class
, т.е. org.apache.hadoop.io.LongWritable
, и когда я пропускаю это во время чтения данных последовательности, он выдает ошибку, которая упоминается в посте.
val sequenceData=sc.sequenceFile("/ordersDataSet",classOf[org.apache.hadoop.io.LongWritable],classOf[org.apache.hadoop.io.LongWritable]).map(rec => rec.toString())
Я не думаю, что точка B
является основной причиной этой ошибки, но я очень уверен, что точка A
является реальной причиной этой ошибки.
2) Ниже описано, как я решил свою проблему.
Я импортировал данные в виде файла avro
data
в другом месте назначения, используя SQOOP
. Затем я создал датафрейм из avro, используя следующие способы:
scala> import com.databricks.spark.avro._;
scala> val avroData=sqlContext.read.avro("path")
Теперь я создал key-value pair
и сохранил его как sequence
file
avroData.map(p=>(p(0).toString,(p(0)+"\t"+p(1)+"\t"+p(2)+"\t"+p(3)))).saveAsSequenceFile("/user/cloudera/problem5/sequence")
Теперь, когда я пытаюсь прочитать few
символов вышеописанного файла, это дает мне two classes
, что мне нужно при чтении файла, как показано ниже:
[cloudera@quickstart ~]$ hadoop fs -cat /user/cloudera/problem5/sequence/part-00000 | head -c 300
SEQorg.apache.hadoop.io.Textorg.apache.hadoop.io.Text^#%���8P���11 1374735600000 11599 CLOSED&2#2 1374735600000 256 PENDING_PAYMENT!33 1374735600000 12111 COMPLETE44 1374735600000 8827 CLOSED!55 1374735600000 11318 COMPLETE 66 1374cat: Unable to write to output stream.
scala> val sequenceData=sc.sequenceFile("/user/cloudera/problem5/sequence",classOf[org.apache.hadoop.io.Text],classOf[org.apache.hadoop.io.Text]).map(rec=>rec.toString)
sequenceData: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[26] at map at <console>:30
Теперь, когда я пытаюсь распечатать данные, отображаются данные, как показано ниже:
scala> sequenceData.take(4).foreach(println)
(1,1 1374735600000 11599 CLOSED)
(2,2 1374735600000 256 PENDING_PAYMENT)
(3,3 1374735600000 12111 COMPLETE)
(4,4 1374735600000 8827 CLOSED)
И последнее, но не менее важное. Спасибо всем за ваши ценные усилия. Ура !!