2017-09-28 6 views
0

が、私は(MacOSの上で実行されている)スパークする全く新しいだと私は私のPCで私が持っているいくつかの.parquetファイルをテストしようとしてきた超えましたサイズが約120MBで、マスターをlocal[*]に設定してローカルで実行しようとしています。()はApacheの中には、Java、OutOfMemoryErrorが発生スパーク.collectできません:GCオーバーヘッドの制限が

基本的に私が現在持っている操作のパイプラインは、次の1 ...

 dataset 
      .where(...) 
      .toJavaRDD() 
      .sortBy(...) // Tried .collect() here. Current 'debug' point. 
      .groupBy(...) // Tried .collect() here. 
      .flatMapValues(...) 
      .mapToPair(...) // Tried .collect() here. 
      .reduceByKey(...); // Tried .collect() here. 

私がお願いしたいと思いますまず最初に、どのように私は寄木細工のファイルスキーマを確認することができますか?私はHiveで可能だが何も見つけられていないことを読んだ。私に役立つリソースがあれば、それは本当に簡素化されます。

第2に、groupBy()などでアクセスする必要があるすべての寄木細工の列名がわからないため、最初のsortBy()ですべてを収集しようとしています。 Sparkを使い始めるためのマイナーなテストと、すべての仕組み)。しかし、質問によると、私はいつも与えられたエラーを得る。私が間違っていることは何ですか?結局、私は.collect()をしてはいけませんか?

私はいくつかの点で印刷しようとしたが、それは私の知る限り読んで、彼らは、コンピュータにローカルに保存されている場合、私は本当に知らないか、どのように私は、私は彼らをそうにアクセスできるよう、いくつかのログになっているようです出力を見ることができますか?

Spark設定に関しては、最も基本的な設定です。

final SparkConf sparkConf = new SparkConf() 
     .setMaster("local[*]") 
     .setAppName("test_app_name"); 

    final JavaSparkContext jsc = new JavaSparkContext(sparkConf); 

    // Get the singleton instance of SparkSession 
    SparkSession sparkSession = SparkSession.builder() 
      .config(jsc.getConf()) 
      .getOrCreate(); 

    Dataset<Row> dataset = sparkSession.read() 
      .parquet(inputPath); 
+1

'dataset.printSchema'は、あなたのデータフレームのスキーマを与える必要があります。 'collect'はあなたの' dataset'の全内容をあなたの運転者の記憶に持ち込みます。 'dataset.collect'は' sortBy'と 'groupBy'の部分の正しい引数ではないと思います。 – philantrovert

+0

速い返信@philantrovertのための多くのおかげで、問題の最初の部分が解決!ちょうどスキーマを持って、完璧!その膨大な量のデータをメモリにロードすることなくプレビューするために、データのほんの一部を取得する最良の方法はどれですか? – Niconoid

+1

あなたのデータフレームで何をしようとしているのか分かりませんが、データフレームのソートとグループ化の方法があります。したがって、RDDに変換するのではなく、データフレームAPIでできることを達成することができます。ここにはたくさんの関数があります:https://spark.apache.org/docs/1.6.2/api/java/org/apache/spark/sql/functions.html – philantrovert

答えて

0

あなたのデータが巨大であれば、sparkでコレクトアクションを行うのは良くありません。基本的にCollectはすべてのデータをドライバに持ち込みます。これにより、ドライバーでメモリoutOfがバインドされます。あなたが収集しているデータがかなり小さいことが絶対に確かでない限り。あなたは以下の

dataset.show(10) // number of rows you want to see 

それとも

dataset.take(10).foreach(println) // takes 10 rows and print 

を使用することができ、データセットの数行を印刷するには

dataset.printSchema 

を行う必要があり、データセット/データフレームスキーマを表示するには

サンプリングのためにランダムな行を表示する場合は、

df.select("name").sample(.2, true).show(10) 

それとも

df.select("name").sample(.2, true).take(10).foreach(println) 
関連する問題