没有 Encoder[Row] 类型的隐式参数

Posted

技术标签:

【中文标题】没有 Encoder[Row] 类型的隐式参数【英文标题】:No implicit arguments of type Encoder[Row] 【发布时间】:2021-10-28 06:05:57 【问题描述】:

我一直在尝试学习如何在 scala 中使用 map 函数。但是,我不断收到错误No implicit arguments of type Encoder[Row]。如何在不必创建定义 json 建模方式的类的情况下修复此错误?

val spark = SparkSession.builder
    .appName("SparkSQL")
    .master("local[*]")
    .getOrCreate()

val df = spark.read.json("src/main/scala/data.json")

val df2 = df.map(r => r)
df2.printSchema()

【问题讨论】:

【参考方案1】:

您可以为Row 定义自定义EncoderRowEncoder,如果您有其架构并且由于r 没有更改,您可以安全地使用源DataFrame df 中的架构而无需在编译时知道架构。

您也可以使用来源DataFrame 的编码器,同样应该是安全的。

import org.apache.spark.sql.catalyst.encoders.RowEncoder

val df2 = df.map(r => r)(RowEncoder(df.schema))
val df3 = df.map(r => r)(df.encoder)

【讨论】:

以上是关于没有 Encoder[Row] 类型的隐式参数的主要内容,如果未能解决你的问题,请参考以下文章

找不到参数的隐式值

Scala 类型参数化,Shapeless - 找不到参数 Generic 的隐式值

无法解析受约束的类类型参数的隐式

参数类型的隐式 ParameterBinderFactory[org.joda.time.LocalDateTime]

Scala隐式参数

找不到参数映射器的隐式值