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がすでにメモリ内にあるデータを解析できることは私には理にかなっています。
どんな助けでもいただければ幸いです。
あなたはあなたの人生を楽にするために少なくとも4つの異なるアプローチを使うことができます:
入力ストリームを使用し、ローカルファイルに書き込み(SSDで高速)、Sparkで読み取ります。
S3用のHadoopファイルシステムコネクタを使用します Google Cloud Storage そしてすべてをファイル操作に変えます。 (これにはHDFSコネクタがないため、任意のURLからの読み取りに関する問題は解決されません。)
さまざまな入力タイプをさまざまなURIとして表し、URIを検査して、適切な読み取り操作をトリガーするユーティリティ関数を作成します。
(3)と同じですが、URIの代わりにユースケースクラスを使用し、入力タイプに基づいて単にオーバーロードします。