一尘不染

使用Java API创建简单的1行Spark DataFrame

java

在Scala中,我可以像这样从内存中的字符串创建单行DataFrame:

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

df.show()运行时,它输出:

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

现在,我正在尝试从Java类内部执行此操作。 显然JavaRDD,没有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行1列的DataFrame中, 并指定该列的名称?
(以便df.show()与上面的Scala相同)?


阅读 384

收藏
2020-12-03

共1个答案

一尘不染

您可以通过创建到Rdd的列表,然后创建将包含列名的Schema来实现。

可能还有其他方法,只是其中一种。

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|
2020-12-03