如何在 Spark 中从 s3 读取 .seq 文件
How to read a .seq file from s3 in Spark
我正在尝试从 s3 获取 .seq 文件。当我尝试使用
阅读它时
sc.textFile("s3n://logs/box316_0.seq").take(5).foreach(println)
它输出 -
SEQorg.apache.hadoop.io.Text"org.apache.hadoop.io.BytesWritable'org.apache.hadoop.io.compress.GzipCodecp
然后是一堆编码字符。那是什么格式,我应该如何解码这个文件?我第一次使用 hadoop,所以请大方 :)
更新:我试过了
sc.sequenceFile[Text,BytesWritable]("s3n://logs/box316_0.seq").take(5).foreach(println)
所以数据是 Json 存储在序列文件中的 blob,它给了我 -
Serialization stack: - object not serializable
(class: org.apache.hadoop.io.Text, value: 5) -
field (class: scala.Tuple2, name: _1, type: class java.lang.Object)
- object (class scala.Tuple2, (5,7g 22 73 69 6d 65 43 74 71 9d 90 92 3a .................. – user1579557 5 mins ago
对于序列文件,您必须了解类型。看起来你的是 Text,BytesWritable。试试这个:
sc.sequenceFile[Text,BytesWritable]("s3n://logs/box316_0.seq").take(5).foreach(println)
尝试:
val path = "s3n://logs/box316_0.seq"
val seq = sc.sequenceFile[LongWritable,BytesWritable](path)
val usableRDD = seq.map({case (_,v : BytesWritable) => Text.decode(v.getBytes))
我们经常遇到这个问题,因此我们继续并围绕它构建了一个解决方案。我们称之为 readSEQ。这使您可以将序列文件读出到 Parquet、AVRO 或 JSON.
我正在尝试从 s3 获取 .seq 文件。当我尝试使用
阅读它时sc.textFile("s3n://logs/box316_0.seq").take(5).foreach(println)
它输出 -
SEQorg.apache.hadoop.io.Text"org.apache.hadoop.io.BytesWritable'org.apache.hadoop.io.compress.GzipCodecp
然后是一堆编码字符。那是什么格式,我应该如何解码这个文件?我第一次使用 hadoop,所以请大方 :)
更新:我试过了
sc.sequenceFile[Text,BytesWritable]("s3n://logs/box316_0.seq").take(5).foreach(println)
所以数据是 Json 存储在序列文件中的 blob,它给了我 -
Serialization stack: - object not serializable
(class: org.apache.hadoop.io.Text, value: 5) -
field (class: scala.Tuple2, name: _1, type: class java.lang.Object)
- object (class scala.Tuple2, (5,7g 22 73 69 6d 65 43 74 71 9d 90 92 3a .................. – user1579557 5 mins ago
对于序列文件,您必须了解类型。看起来你的是 Text,BytesWritable。试试这个:
sc.sequenceFile[Text,BytesWritable]("s3n://logs/box316_0.seq").take(5).foreach(println)
尝试:
val path = "s3n://logs/box316_0.seq"
val seq = sc.sequenceFile[LongWritable,BytesWritable](path)
val usableRDD = seq.map({case (_,v : BytesWritable) => Text.decode(v.getBytes))
我们经常遇到这个问题,因此我们继续并围绕它构建了一个解决方案。我们称之为 readSEQ。这使您可以将序列文件读出到 Parquet、AVRO 或 JSON.