Spark 2.2.0 数据集中的输出格式不可读

Posted

技术标签:

【中文标题】Spark 2.2.0 数据集中的输出格式不可读【英文标题】:Output not in readable format in Spark 2.2.0 Dataset 【发布时间】:2017-12-28 02:10:59 【问题描述】:

以下是我尝试在 intellij IDE 上使用 spark2.2.0 执行的代码。但我得到的输出不是可读格式。

val spark = SparkSession
      .builder()
      .appName("Spark SQL basic example").master("local[2]")
      .getOrCreate()

    // For implicit conversions like converting RDDs to DataFrames
    import spark.implicits._

    import scala.reflect.ClassTag
    implicit def kryoEncoder[A](implicit ct: ClassTag[A]) =
      org.apache.spark.sql.Encoders.kryo[A](ct)

    case class Person(name: String, age: Long)

    // Encoders are created for case classes
    val caseClassDS = Seq(Person("Andy", 32)).toDS()
    caseClassDS.show()

输出显示:

+--------------------+
|               value|
+--------------------+
|[01 00 44 61 74 6...|
+--------------------+

如果我在这里遗漏了什么,谁能解释一下?

谢谢

【问题讨论】:

【参考方案1】:

这是因为您使用的是 Kryo Encoder,它并非旨在反序列化 show 的对象。

一般来说,当有更精确的Encoders 可用时,您永远不应该使用 Kryo Encoder。它的性能较差,功能较少。而是使用ProductEncoder

spark.createDataset(Seq(Person("Andy", 32)))(Encoders.product[Person])

【讨论】:

谢谢,但这似乎对我不起作用。将 val caseClassDS = spark.createDataset(Seq(Person("Andy", 32)))(Encoders.product[Person]) 添加到我的代码中会出现异常: 谢谢,但这似乎对我不起作用。将 val caseClassDS = spark.createDataset(Seq(Person("Andy", 32)))(Encoders.product[Person]) 添加到我的代码中会出现异常:错误:(24, 84) 没有 TypeTag 可用于 Person val caseClassDS = spark.createDataset(Seq(Person("Andy", 32)))(Encoders.product[Person]) 您能从implicit def kryoEncoder[ 中删除implicit 并重新开始吗?或者完全删除implicit def kryoEncoder

以上是关于Spark 2.2.0 数据集中的输出格式不可读的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark 中使用 PCA 进行异常检测

使用空数据集的Spark SQL连接会导致更大的输出文件大小

modbus数据格式

Spark:数据集中的四舍五入

spark数据分析练习

Spark 检查数据集中是不是有至少 n 个元素