从包含 Spark 中字符串数组的 RDD 创建 SQLContext 数据集 [重复]
Posted
技术标签:
【中文标题】从包含 Spark 中字符串数组的 RDD 创建 SQLContext 数据集 [重复]【英文标题】:Creating a SQLContext Dataset from an RDD containing arrays of Strings in Spark [duplicate] 【发布时间】:2017-12-04 08:13:33 【问题描述】:所以我有一个变量data
,它是一个RDD[Array[String]]
。我想迭代它并比较相邻的元素。为此,我必须从 RDD 创建一个数据集。
我尝试以下,sc
是我的SparkContext
:
import org.apache.spark.sql.SQLContext
val sqc = new SQLContext(sc)
val lines = sqc.createDataset(data)
我得到以下两个错误:
错误:(12, 34) 无法找到存储在数据集中的类型的编码器。 原始类型(Int、String 等)和产品类型(案例类) 通过导入 sqlContext.implicits._ 支持 序列化其他类型将在以后的版本中添加。 val 行 = sqc.createDataset(data)
错误:(12, 34) 方法 createDataset 的参数不足: (隐含证据$4: org.apache.spark.sql.Encoder[Array[String]])org.apache.spark.sql.Dataset[Array[String]]。 未指定值参数evidence$4。 val 行 = sqc.createDataset(data)
当然,我知道我需要传递一个编码器参数,但是,在这种情况下它会是什么以及如何导入编码器?当我尝试自己时,它说createDataset
不会将其作为参数。
有类似的问题,但没有回答如何使用编码器参数。如果我的 RDD 是 RDD[String]
,它工作得非常好,但是在这种情况下它是 RDD[Array[String]]
。
【问题讨论】:
import sqc.implicits._
我不认为它是重复的,因为我已经阅读了这些问题。
那么如果我导入它,我该如何使用编码器呢? (我将什么传递给第二个参数?)
一旦隐含在范围内,Spark 将自动转换它可以转换的任何东西。如果您想更具体地了解它,可以使用:sqc.createDataset(rdd)(newStringArrayEncoder)
import sqlContext.implicits._
for spark ver spark.implicits._ for Spark2+
【参考方案1】:
问题中的所有 cmets 都试图告诉您以下内容
你说你有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
但在此之前您需要import
implicits._
的sqlContext
如下
val sqc = new SQLContext(sc)
import sqc.implicits._
rdd.toDF().show(false)
你应该有dataframe
+------+
|value |
+------+
|[a, b]|
|[d, e]|
|[g, f]|
|[e, r]|
+------+
这不是很简单吗?
【讨论】:
以上是关于从包含 Spark 中字符串数组的 RDD 创建 SQLContext 数据集 [重复]的主要内容,如果未能解决你的问题,请参考以下文章