在 Spark 中从包含字符串数组的 RDD 创建 SQLContext 数据集
Creating a SQLContext Dataset from an RDD containing arrays of Strings in Spark
所以我有一个变量 data
,它是一个 RDD[Array[String]]
。我想遍历它并比较相邻的元素。为此,我必须从 RDD 创建一个数据集。
我尝试以下操作,sc
是我的 SparkContext
:
import org.apache.spark.sql.SQLContext
val sqc = new SQLContext(sc)
val lines = sqc.createDataset(data)
我得到以下两个错误:
Error:(12, 34) Unable to find encoder for type stored in a Dataset.
Primitive types (Int, String, etc) and Product types (case classes)
are supported by importing sqlContext.implicits._ Support for
serializing other types will be added in future releases.
val lines = sqc.createDataset(data)
Error:(12, 34) not enough arguments for method createDataset:
(implicit evidence:
org.apache.spark.sql.Encoder[Array[String]])org.apache.spark.sql.Dataset[Array[String]].
Unspecified value parameter evidence.
val lines = sqc.createDataset(data)
当然,我知道我需要传递一个编码器参数,但是,在这种情况下它会是什么以及如何导入编码器?当我自己尝试时,它说 createDataset
不将其作为参数。
有类似的问题,但是没有回答如何使用encoder参数。如果我的 RDD 是 RDD[String]
它工作得很好,但在这种情况下它是 RDD[Array[String]]
.
问题中的所有评论都试图告诉你以下事情
你说你有 RDD[Array[String]]
,这是我通过执行以下操作创建的
val rdd = sc.parallelize(Seq(Array("a", "b"), Array("d", "e"), Array("g", "f"), Array("e", "r"))) //rdd: org.apache.spark.rdd.RDD[Array[String]] = ParallelCollectionRDD[0] at parallelize at worksheetTest.sc4592:13
现在将rdd
转换为dataframe
是调用.toDF
,但在此之前,您需要将sqlContext
的import
implicits._
作为以下
val sqc = new SQLContext(sc)
import sqc.implicits._
rdd.toDF().show(false)
你应该 dataframe
作为
+------+
|value |
+------+
|[a, b]|
|[d, e]|
|[g, f]|
|[e, r]|
+------+
这一切是不是很简单?
所以我有一个变量 data
,它是一个 RDD[Array[String]]
。我想遍历它并比较相邻的元素。为此,我必须从 RDD 创建一个数据集。
我尝试以下操作,sc
是我的 SparkContext
:
import org.apache.spark.sql.SQLContext
val sqc = new SQLContext(sc)
val lines = sqc.createDataset(data)
我得到以下两个错误:
Error:(12, 34) Unable to find encoder for type stored in a Dataset. Primitive types (Int, String, etc) and Product types (case classes) are supported by importing sqlContext.implicits._ Support for serializing other types will be added in future releases. val lines = sqc.createDataset(data)
Error:(12, 34) not enough arguments for method createDataset: (implicit evidence: org.apache.spark.sql.Encoder[Array[String]])org.apache.spark.sql.Dataset[Array[String]]. Unspecified value parameter evidence. val lines = sqc.createDataset(data)
当然,我知道我需要传递一个编码器参数,但是,在这种情况下它会是什么以及如何导入编码器?当我自己尝试时,它说 createDataset
不将其作为参数。
有类似的问题,但是没有回答如何使用encoder参数。如果我的 RDD 是 RDD[String]
它工作得很好,但在这种情况下它是 RDD[Array[String]]
.
问题中的所有评论都试图告诉你以下事情
你说你有 RDD[Array[String]]
,这是我通过执行以下操作创建的
val rdd = sc.parallelize(Seq(Array("a", "b"), Array("d", "e"), Array("g", "f"), Array("e", "r"))) //rdd: org.apache.spark.rdd.RDD[Array[String]] = ParallelCollectionRDD[0] at parallelize at worksheetTest.sc4592:13
现在将rdd
转换为dataframe
是调用.toDF
,但在此之前,您需要将sqlContext
的import
implicits._
作为以下
val sqc = new SQLContext(sc)
import sqc.implicits._
rdd.toDF().show(false)
你应该 dataframe
作为
+------+
|value |
+------+
|[a, b]|
|[d, e]|
|[g, f]|
|[e, r]|
+------+
这一切是不是很简单?