从镶木地板自动推断模式/有选择地将字符串转换为浮点数
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 创建
【讨论】:
以上是关于从镶木地板自动推断模式/有选择地将字符串转换为浮点数的主要内容,如果未能解决你的问题,请参考以下文章