Spark 数据类型猜测器 UDAF

Spark data type guesser UDAF

想拍这样的东西 https://github.com/fitzscott/AirQuality/blob/master/HiveDataTypeGuesser.java 并创建一个 Hive UDAF 来创建一个 returns 数据类型猜测的聚合函数。

Spark 是否已经内置了类似的东西? 对于新的宽数据集探索数据将非常有用。对 ML 也有帮助,例如决定分类变量与数值变量。

在Spark中你一般是如何判断数据类型的?

P.S。像 h2o 这样的框架会自动确定扫描数据样本或整个数据集的数据类型。这样就可以决定例如如果变量应该是分类变量或数值。

P.P.S。另一个用例是,如果你得到一个任意数据集(我们经常得到它们),并想保存为 Parquet table。 提供正确的数据类型可以使 parquet 更加 space 高效(并且可能具有更高的查询时性能,例如 比仅将所有内容存储为 string/varchar).

更好的 parquet bloom 过滤器

Does Spark have something like this already built-in?

部分。 Spark 生态系统中有一些工具可以执行模式推理,例如 spark-csv or pyspark-csv and category inference (categorical vs. numerical) like VectorIndexer.

到目前为止一切顺利。问题是模式推断的适用性有限,通常不是一件容易的事,会引入难以诊断的问题并且可能非常昂贵:

  1. 可与 Spark 一起使用的格式并不多,可能需要模式推断。实际上,它仅限于 CSV 和固定宽度格式数据的不同变体。
  2. 根据数据表示,可能无法确定正确的数据类型或推断类型可能导致信息丢失:

    • 将数字数据解释为 float 或 double 会导致不可接受的精度损失,尤其是在处理财务数据时
    • 日期或数字格式可能因地区而异
    • 一些常见的标识符可能看起来像数字,但具有一些可能在转换中丢失的内部结构
  3. 自动模式推断可以掩盖输入数据的不同问题,如果它不受可以突出可能问题的其他工具的支持,则可能很危险。此外,数据加载和清理期间的任何错误都可以通过完整的数据处理管道传播。

    可以说,在我们开始考虑可能的表示和编码之前,我们应该对输入数据有很好的理解。

  4. 模式推断和/或类别推断可能需要完整的数据扫描和/或大型查找表。两者在大型数据集上都可能很昂贵甚至不可行。

编辑:

似乎 CSV 文件的模式推理功能已直接添加到 Spark SQL。参见 CSVInferSchema