【问题标题】:Spark: How to Read Avro or Parquet File as DatasetSpark:如何将 Avro 或 Parquet 文件作为数据集读取
【发布时间】:2018-10-30 12:22:00
【问题描述】:

鉴于 Avro 和 Parquet 文件包含数据和该数据的模式,那么在 Spark 中,应该可以将这些文件作为 Dataset 而不是 DataFrame 读取。但是我看到的所有来源都将这些文件作为 DataFrame 读取,无论如何我都找不到将这些文件作为 Dataset 读取。

有人知道如何将这些文件作为数据集读取吗?

【问题讨论】:

  • DataFrameDataset(准确地说是Dataset[Row])。
  • 是的,但真正的数据集知道每一列的类型。而 DataFrame 不知道每个字段的类型是什么;它只知道它拥有一个 Rows 集合。
  • 这不是真的。在这两种情况下,Dataset“知道”关于列类型的信息量完全相同。这就是特别允许 Catalyst 优化的原因。区别在于它可以向编译器提供多少信息。
  • 不,不是。你应该回去阅读基础知识。进行区分是有原因的,原因是在 DataFrame 中,每一行都被视为一个行,而不是构成行的字段。使用纯数据集,Spark 可以执行更好的优化。
  • 用“纯数据集”(意思是DataFrame/SQL API 之外)Spark 可以申请fewer optimizations。 “二进制”Encoders 是唯一的性能改进(与 RowEncoder 相比)。此外,表示不会改变。如果您有ds: Dataset[Row] 和子ds.as[T]: Dataset[T],则内部存储保持完全相同。

标签: apache-spark dataset apache-spark-sql avro parquet


【解决方案1】:
def readParquet(spark: SparkSession): Unit = {
  import org.apache.spark.sql._
  import spark.implicits._
  import Test._

  spark.conf.set("spark.sql.parquet.enableVectorizedReader", "false") // This is optional, only if you face any spark parquet decoders

  val schema = Encoders.product[TestData].schema
  val ds =
    spark.read
      .schema(schema)
      .parquet("data.parquet")
      .as[TestData]

  ds.show(false)
}

object Test {
  case class TestData(id: Int, name: String, usedAmount: Double)
}

【讨论】:

    猜你喜欢
    • 2019-05-11
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 2020-01-31
    • 2018-10-04
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多