web-dev-qa-db-ja.com

Spark:ファイルの代わりにinputStreamを読み取ります

JavaアプリケーションでSparkSQLを使用して、解析にDatabricksを使用してCSVファイルでいくつかの処理を実行しています。

私が処理しているデータはさまざまなソース(リモートURL、ローカルファイル、Google Cloud Storage)からのものであり、データがどこから来たのかを知らなくてもデータを解析して処理できるように、すべてをInputStreamに変換する習慣があります。

Sparkで見たすべてのドキュメントは、パスからファイルを読み取ります。

SparkConf conf = new SparkConf().setAppName("spark-sandbox").setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf);
SQLContext sqlc = new SQLContext(sc);

DataFrame df = sqlc.read()
    .format("com.databricks.spark.csv")
    .option("inferSchema", "true")
    .option("header", "true")
    .load("path/to/file.csv");

DataFrame dfGrouped = df.groupBy("varA","varB")
    .avg("varC","varD");

dfGrouped.show();

そして、私がやりたいのは、InputStreamから、またはすでにメモリ内にある文字列から読み取ることです。次のようなもの:

InputStream stream = new URL(
    "http://www.sample-videos.com/csv/Sample-Spreadsheet-100-rows.csv"
    ).openStream();

DataFrame dfRemote = sqlc.read()
    .format("com.databricks.spark.csv")
    .option("inferSchema", "true")
    .option("header", "true")
    .load(stream);

String someString = "imagine,some,csv,data,here";

DataFrame dfFromString = sqlc.read()
    .format("com.databricks.spark.csv")
    .option("inferSchema", "true")
    .option("header", "true")
    .read(someString);

私がここで見逃している単純なものはありますか?

Sparkストリーミングとカスタムレシーバーに関するドキュメントを少し読みましたが、私が知る限り、これはデータを継続的に提供する接続を開くためのものです。Sparkストリーミングは、データをチャンクに分割し、それに対して何らかの処理を行うようで、終わりのないストリームでより多くのデータが来ることを期待しています。

ここでの私の最も良い推測は、SparkはHadoopの子孫として、おそらくどこかのファイルシステムに存在する大量のデータを期待しているということです。しかしSparkは、その処理を行うのでとにかくメモリ内で、SparkSQLがすでにメモリ内にあるデータを解析できることは私には理にかなっています。

どんな助けでもいただければ幸いです。

12
Nate Vaughan

あなたはあなたの人生を楽にするために少なくとも4つの異なるアプローチを使うことができます:

  1. 入力ストリームを使用し、ローカルファイルに書き込み(SSDで高速)、Sparkで読み取ります。

  2. S3用のHadoopファイルシステムコネクタを使用します Google Cloud Storage そしてすべてをファイル操作に変えます。 (これにはHDFSコネクタがないため、任意のURLからの読み取りに関する問題は解決されません。)

  3. さまざまな入力タイプをさまざまなURIとして表し、URIを検査して、適切な読み取り操作をトリガーするユーティリティ関数を作成します。

  4. (3)と同じですが、URIの代わりにユースケースクラスを使用し、入力タイプに基づいて単にオーバーロードします。

2
Sim