从包含 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 数据集 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

从来自 java 中 InputStream 的字符串创建 Spark RDD 或数据帧

Spark从入门到精通18:RDD常用高级算子介绍

Python 中 Spark RDD 的列操作

Spark中的RDD依赖是啥?

如何从 RDD 创建 Spark 数据集

spark总结5 RDD