我有一个包含二进制数据的RDD。我想使用'RDD.pipe'将二进制数据传输到外部程序,将其转换为字符串/文本数据。不幸的是,似乎Spark在将二进制数据传递给外部程序之前就已经破坏了它。
此代码代表我想要做的事情。我究竟做错了什么?如何在Spark中管道二进制数据?
bin = sc.textFile("binary-data.dat")
csv = bin.pipe ("/usr/bin/binary-to-csv.sh")
csv.saveAsTextFile("text-data.csv")
具体来说,我正在尝试使用Spark将pcap(数据包捕获)数据转换为text / csv,以便我可以对其进行分析。
答案 0 :(得分:5)
问题不在于我使用'pipe',而是'textFile'不能用于读取二进制数据。 (Doh)有几种选择可以继续前进。
实现了解二进制输入数据的自定义'InputFormat'。 (非常感谢Cloudera的Sean Owen指出这一点。)
使用'SparkContext.binaryFiles'将整个二进制文件作为单个记录读入。这会影响性能,因为它会阻止在文件数据上使用多个映射器。
在#1的特定情况下,我只能找到一个project from RIPE-NCC来执行此操作。不幸的是,它似乎只支持一组有限的网络协议。