从单个字符串创建Spark DataFrame

7

我正在尝试将硬编码的字符串转换为一个包含单个类型为StringType列的1行Spark数据框(DataFrame)。

String fizz = "buzz"

这将生成一个 DataFrame,其.show()方法如下所示:

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

到目前为止,我最好的尝试是:

val rawData = List("fizz")
val df = sqlContext.sparkContext.parallelize(Seq(rawData)).toDF()

df.show()

但我遇到了以下编译器错误:

java.lang.ClassCastException: org.apache.spark.sql.types.ArrayType cannot be cast to org.apache.spark.sql.types.StructType
    at org.apache.spark.sql.SQLContext.createDataFrame(SQLContext.scala:413)
    at org.apache.spark.sql.SQLImplicits.rddToDataFrameHolder(SQLImplicits.scala:155)

有任何想法我做错了什么吗?还有,如何将"buzz"设置为fizz列的行值?


更新:

尝试中:

sqlContext.sparkContext.parallelize(rawData).toDF()

我得到的DF长这样:

+----+
|  _1|
+----+
|buzz|
+----+
2个回答

9

尝试:

sqlContext.sparkContext.parallelize(rawData).toDF()

在2.0版本中,您可以:

import spark.implicits._

rawData.toDF

可选地为toDF提供一系列名称:

sqlContext.sparkContext.parallelize(rawData).toDF("fizz")

谢谢@LostInOverflow (+1) - 我觉得我快成功了,请看我的更新。我得到了一个单行DF,里面有正确的值(“buzz”字符串),但列名是“_1”...你有什么想法吗? - smeeb
数据框类似于表格形式的数据集,具有列/标题。在第一种情况下,您创建了没有指定列名的数据框,因此它将默认列分配为“_1”、“_2”。 - KiranM
这在Java中怎么实现?sparkContext.parallelize需要两个额外的参数:numSlices和ClassTag。第二个对我来说不太清楚。 - martin_wun

0

在Java中,以下代码可以正常工作:

List<String> textList = Collections.singletonList("yourString");
SQLContext sqlContext = new SQLContext(sparkContext);
Dataset<Row> data = sqlContext
      .createDataset(textList, Encoders.STRING())
      .withColumnRenamed("value", "text");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接