私は2 GB
私のHDFS
のデータ。
そのデータをランダムに取得することは可能ですか? Unixコマンドラインで行うように
cat iris2.csv |head -n 50
ネイティブヘッド
hadoop fs -cat /your/file | head
headがすべての行の読み取りを終了するとすぐにcatはストリームを閉じるため、ここでは効率的です。
tailを取得するには、hadoopに特別な効果的なコマンドがあります。
hadoop fs -tail /your/file
残念ながら、指定された行数ではなく、データの最後のキロバイトを返します。
Linuxのhead
およびtail
コマンドは、それぞれ最初の10行と最後の10行を表示します。ただし、これら2つのコマンドの出力はランダムにサンプリングされるのではなく、ファイル自体と同じ順序です。
Linux shuffle-shuf
コマンドは、入力行のランダムな順列を生成するのに役立ちます。これをHadoopコマンドと組み合わせて使用すると、次のように役立ちます。
$ hadoop fs -cat <file_path_on_hdfs> | shuf -n <N>
したがって、この場合、iris2.csv
はHDFS上のファイルであり、データセットから50行をランダムにサンプリングしたい場合:
$ hadoop fs -cat /file_path_on_hdfs/iris2.csv | shuf -n 50
注:Linuxのsort
コマンドも使用できますが、shuf
コマンドの方が高速で、ランダムにデータをサンプリングできます。
hdfs dfs -cat yourFile | shuf -n <number_of_line>
あなたのためのトリックを行います。MacOSでは利用できませんが。インストールできますGNU coreutils。
私の提案は、そのデータをHiveテーブルにロードすることです。その後、次のようなことができます。
SELECT column1, column2 FROM (
SELECT iris2.column1, iris2.column2, Rand() AS r
FROM iris2
ORDER BY r
) t
LIMIT 50;
編集:これはそのクエリのより簡単なバージョンです:
SELECT iris2.column1, iris2.column2
FROM iris2
ORDER BY Rand()
LIMIT 50;
このコマンドを書く
Sudo -u hdfs hdfs dfs -cat "path of csv file" |head -n 50
50は行数です(要件に基づいてユーザーがカスタマイズできます)
Hadoopでもheadコマンドを使用できます!構文は
hdfs dfs -cat <hdfs_filename> | head -n 3
これにより、ファイルから3行のみが印刷されます。