web-dev-qa-db-ja.com

単純な1行を作成するSpark DataFrame with Java API

Scalaでは、次のようにメモリ内の文字列から単一行のDataFrameを作成できます。

_val stringAsList = List("buzz")
val df = sqlContext.sparkContext.parallelize(jsonValues).toDF("fizz")
df.show()
_

df.show()が実行されると、次のように出力されます。

_+-----+
| fizz|
+-----+
| buzz|
+-----+
_

今、これをJavaクラスの内部から実行しようとしています。どうやらJavaRDDsには、 toDF(String)メソッド。私はもう試した:

_List<String> stringAsList = new ArrayList<String>();
stringAsList.add("buzz");
SQLContext sqlContext = new SQLContext(sparkContext);
DataFrame df = sqlContext.createDataFrame(sparkContext
    .parallelize(stringAsList), StringType);
df.show();
_

...しかし、まだ足りないようです。 df.show();を実行すると、次のようになります。

_++
||
++
||
++
_

(空のDFです。)だから私は尋ねます:Java APIを使用して、メモリ内の文字列を1行のみのDataFrameに読み込む方法そして、その中に1つの列とその列の名前を指定しますか?(つまり、df.show()はScala上記の1つ)?

9
smeeb

これを行うには、RddにListを作成し、列名を含むスキーマを作成します。

他の方法もあるかもしれませんが、それはそれらの1つにすぎません。

List<String> stringAsList = new ArrayList<String>();
        stringAsList.add("buzz");

JavaRDD<Row> rowRDD = sparkContext.parallelize(stringAsList).map((String row) -> {
                return RowFactory.create(row);
            });

StructType schema = DataTypes.createStructType(new StructField[] { DataTypes.createStructField("fizz", DataTypes.StringType, false) });

DataFrame df = sqlContext.createDataFrame(rowRDD, schema).toDF();
df.show();

//+----+
|fizz|
+----+
|buzz|
8
cody123

アップグレードが必要な場合は、Spark 2の例を2つ作成しました。

シンプルなフィズ/バズ(または敵/バー-旧世代:)):

    SparkSession spark = SparkSession.builder().appName("Build a DataFrame from Scratch").master("local[*]")
            .getOrCreate();

    List<String> stringAsList = new ArrayList<>();
    stringAsList.add("bar");

    JavaSparkContext sparkContext = new JavaSparkContext(spark.sparkContext());

    JavaRDD<Row> rowRDD = sparkContext.parallelize(stringAsList).map((String row) -> RowFactory.create(row));

    // Creates schema
    StructType schema = DataTypes.createStructType(
            new StructField[] { DataTypes.createStructField("foe", DataTypes.StringType, false) });

    Dataset<Row> df = spark.sqlContext().createDataFrame(rowRDD, schema).toDF();

2x2データ:

    SparkSession spark = SparkSession.builder().appName("Build a DataFrame from Scratch").master("local[*]")
            .getOrCreate();

    List<String[]> stringAsList = new ArrayList<>();
    stringAsList.add(new String[] { "bar1.1", "bar2.1" });
    stringAsList.add(new String[] { "bar1.2", "bar2.2" });

    JavaSparkContext sparkContext = new JavaSparkContext(spark.sparkContext());

    JavaRDD<Row> rowRDD = sparkContext.parallelize(stringAsList).map((String[] row) -> RowFactory.create(row));

    // Creates schema
    StructType schema = DataTypes
            .createStructType(new StructField[] { DataTypes.createStructField("foe1", DataTypes.StringType, false),
                    DataTypes.createStructField("foe2", DataTypes.StringType, false) });

    Dataset<Row> df = spark.sqlContext().createDataFrame(rowRDD, schema).toDF();

コードは次からダウンロードできます: https://github.com/jgperrin/net.jgp.labs.spark

9
jgp