我们正在使用Spark,直到现在,输出均为PSV文件。现在,为了节省空间,我们想压缩输出。为此,我们将更改为使用SnappyCodec保存JavaRDD,如下所示:
objectRDD.saveAsTextFile(rddOutputFolder, org.apache.hadoop.io.compress.SnappyCodec.class);
然后,我们将使用Sqoop将输出导入数据库。整个过程运行正常。
对于HDFS中以前生成的PSV文件,我们也希望将它们压缩为Snappy格式。这是我们尝试的命令:
hadoop jar /usr/hdp/2.6.5.106-2/hadoop-mapreduce/hadoop-streaming-2.7.3.2.6.5.106-2.jar \
-Dmapred.output.compress=true -Dmapred.compress.map.output=true \
-Dmapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec \
-Dmapred.reduce.tasks=0 \
-input input-path \
-output output-path
该命令运行正常。但是问题是,sqoop无法解析快速的输出文件。
当我们使用“ hdfs dfs -text hdfs-file-name”之类的命令查看生成的文件时,输出如下所示,并且在每一行中都添加了“ index” like字段:
0 2019-05-02|AMRS||5072||||3540||MMPT|0|
41 2019-05-02|AMRS||5538|HK|51218||1000||Dummy|45276|
118 2019-05-02|AMRS||5448|US|51218|TRADING|2282|HFT|NCR|45119|
即,将诸如“ 0”,“ 41”,“ 118”之类的额外值添加到每行的开头。请注意,Spark生成的.snappy文件没有此“额外字段”。
有什么主意如何防止插入此多余的字段?
非常感谢!
答案 0 :(得分:0)
这些不是索引,而是由TextInputFormat
生成的键,如here所述。
您为输入格式提供的类应返回键/值 对Text类。如果您未指定输入格式类,则 默认使用TextInputFormat。由于TextInputFormat 返回LongWritable类的键,这些键实际上不属于 输入数据,密钥将被丢弃;只有值将通过管道传输 到流式映射器。
并且由于您在作业中未定义任何映射器,因此这些键/值对将直接写到文件系统中。因此,如上述摘录提示所示,您需要某种可以丢弃键的映射器。一种快捷的方法是使用已经可用的东西作为传递对象,例如shell cat
命令:
hadoop jar /usr/hdp/2.6.5.106-2/hadoop-mapreduce/hadoop-streaming-2.7.3.2.6.5.106-2.jar \
-Dmapred.output.compress=true -Dmapred.compress.map.output=true \
-Dmapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec \
-mapper /bin/cat \
-Dmapred.reduce.tasks=0 \
-input input-path \
-output output-path