想要像这样做https://github.com/fitzscott/AirQuality/blob/master/HiveDataTypeGuesser.java,创建一个Hive UDAF来生成一个返回数据类型猜测的聚合函数。
Spark是否已经内置了这样的功能?对于探索新的宽数据集非常有用。对机器学习也很有帮助,例如决定分类变量与数值变量。
您通常如何在Spark中确定数据类型?
P.S. 像h2o这样的框架会自动通过扫描数据样本或整个数据集来确定数据类型。这样就可以决定,例如一个变量是否应该是分类变量还是数值变量。
P.P.S. 另一个用例是,如果你得到一个任意数据集(我们经常遇到这种情况),并且想保存为Parquet表。提供正确的数据库类型可以使Parquet更加节省空间(而且可能在查询时性能更高,例如,比将所有内容存储为字符串/变长字符更好的Parquet布隆过滤器)。
回答:
Spark是否已经内置了这样的功能?
部分是的。Spark生态系统中有一些工具可以执行模式推断,如spark-csv
或pyspark-csv
,以及类别推断(分类与数值)如VectorIndexer
。
到目前为止还算不错。问题是模式推断的适用性有限,通常不是一件容易的任务,可能会引入难以诊断的问题,并且可能相当昂贵:
- 可以与Spark一起使用的格式并不多,可能需要模式推断。实际上,它仅限于CSV的不同变体和固定宽度格式的数据。
-
根据数据表示方式,可能无法确定正确的数据类型,或者推断出的类型可能导致信息丢失:
- 将数值数据解释为浮点数或双精度数可能会导致不可接受的精度损失,特别是在处理金融数据时
- 日期或数字格式可能因地区不同而异
- 一些常见的标识符可能看起来像数字,但具有某种内部结构,在转换过程中可能会丢失
-
自动模式推断可以掩盖输入数据的不同问题,如果没有额外的工具来突出可能的问题,这可能是危险的。此外,数据加载和清理过程中的任何错误都可能传播到整个数据处理流程中。
可以说,我们应该在开始考虑可能的表示和编码之前,对输入数据有很好的理解。
-
模式推断和/或类别推断可能需要完整的数据扫描和/或大型查找表。这两者在处理大型数据集时可能非常昂贵,甚至不可行。
编辑:
看起来CSV文件的模式推断功能已直接添加到Spark SQL中。请参见CSVInferSchema
。