在Scala中,我可以像这样从内存中的字符串创建单行DataFrame:
val stringAsList = List("buzz") val df = sqlContext.sparkContext.parallelize(jsonValues).toDF("fizz") df.show()
当df.show()运行时,它输出:
df.show()
+-----+ | fizz| +-----+ | buzz| +-----+
现在,我正在尝试从Java类内部执行此操作。 显然JavaRDD,没有toDF(String)方法。我试过了:
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.show();
++ || ++ || ++
(一个空的DF。)所以我问:如何使用 Java API 将内存中的字符串读取到其中只有1行1列的DataFrame中, 并指定该列的名称? (以便df.show()与上面的Scala相同)?
您可以通过创建到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|