Nach den fsshell documentation, der getmerge
Befehl grundsätzlich behandelt den Zielpfad als „local“ Pfad (so in gs://my-bucket/temp_merged
es das „Schema“ und „Autorität“ Komponenten zu ignorieren und versuchen, direkt auf Ihren lokalen Dateisystem-Pfad zu schreiben /temp_meged
; Dies ist nicht spezifisch für den GCS-Anschluss, Sie werden das gleiche sehen, wenn Sie versuchen, hadoop fs -getmerge gs://my-bucket/temp/part-* hdfs:///temp_merged
, und noch schlimmer, wenn Sie etwas wie hadoop fs -getmerge gs://my-bucket/temp/part-* hdfs:///tmp/temp_merged
versuchen, können Sie denken, es gelungen, wenn in der Tat die Datei nicht innerhalb hdfs:///tmp/temp_merged
erscheinen würde, aber stattdessen erschien unter Ihrem lokalen Dateisystem, file:///tmp/temp_merged
.
Sie können Verwenden Sie stattdessen die Pipe stdout/stdin, um dies zu ermöglichen. leider -getmerge
spielt nicht gut mit /dev/stdout
aufgrund von Berechtigungen und die Verwendung von .crc
Dateien, aber Sie können den gleichen Effekt mit der Funktion in hadoop fs -put
erreichen, die das Lesen von stdin unterstützt:
hadoop fs -cat gs://my-bucket/temp/part-* | \
hadoop fs -put - gs://my-bucket/temp_merged