从镶木地板自动推断模式/有选择地将字符串转换为浮点数

Posted

技术标签:

【中文标题】从镶木地板自动推断模式/有选择地将字符串转换为浮点数【英文标题】:Auto infer schema from parquet/ selectively convert string to float 【发布时间】:2018-02-02 07:12:26 【问题描述】:

我有一个包含 400 多列的 parquet 文件,当我阅读它时,附加到很多列的默认数据类型是字符串(可能是由于其他人指定的架构)。

我找不到类似的参数

inferSchema=True' #for spark.read.parquet, present for spark.read.csv

我尝试改变

mergeSchema=True #but it doesn't improve the results

要手动将列转换为浮点数,我使用了

df_temp.select(*(col(c).cast("float").alias(c) for c in df_temp.columns))

这运行没有错误,但将所有实际的字符串列值转换为 Null。我无法将其包装在 try, catch 块中,因为它不会引发任何错误。

有没有一种方法可以检查列是否仅包含“整数/浮点”值并有选择地将这些列转换为浮点数?

【问题讨论】:

*** 在这个问题后阻止了我询问更多信息,有什么建议可以改进吗? 【参考方案1】:

Parquet 列是类型化的,因​​此在加载 Parquet 文件时没有架构推断之类的东西。

有没有一种方法可以检查列是否仅包含“整数/浮点”值并有选择地将这些列转换为浮点数?

您可以使用与 Spark 相同的逻辑 - 定义首选类型层次结构并尝试强制转换,直到找到最有选择性的类型,它解析列中的所有值。

How to force inferSchema for CSV to consider integers as dates (with "dateFormat" option)? Spark data type guesser UDAF

【讨论】:

【参考方案2】:

目前没有简单的方法, 有一个 Github issue 已经存在,可以参考

https://github.com/databricks/spark-csv/issues/264

类似https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/csv/CSVInferSchema.scala

为 scala 存在,可以为 pyspark 创建

【讨论】:

以上是关于从镶木地板自动推断模式/有选择地将字符串转换为浮点数的主要内容,如果未能解决你的问题,请参考以下文章

从镶木地板表中选择在蜂巢中不返回任何内容

如何从镶木地板文件中获取架构/列名?

如何从镶木地板文件创建表格

熊猫:从镶木地板文件中读取前 n 行?

重命名后如何从镶木地板文件中恢复旧列值?

无法从镶木地板中读取零件文件