Inferschema 检测列作为字符串而不是来自 pyspark 中镶木地板的双精度
Posted
技术标签:
【中文标题】Inferschema 检测列作为字符串而不是来自 pyspark 中镶木地板的双精度【英文标题】:Inferschema detecting column as string instead of double from parquet in pyspark 【发布时间】:2020-06-23 11:31:56 【问题描述】:问题 - 我正在使用 azure databricks 在 pyspark 中读取镶木地板文件。有些列有很多空值并且有十进制值,这些列被读取为字符串而不是双精度。
有什么方法可以在 pyspark 中推断出正确的数据类型?
代码-
读取 parquet 文件 -
df_raw_data = sqlContext.read.parquet(data_filename[5:])
此输出是一个包含 100 多列的数据帧,其中大多数列的类型为 double,但 printSchema() 将其显示为字符串。
P.S- 我有一个镶木地板文件,它可以有动态列,因此为数据框定义结构对我不起作用。我曾经将 spark 数据帧转换为 pandas 并使用 convert_objects 但这不起作用,因为 parquet 文件很大。
【问题讨论】:
请出示您的代码 嗨@thebluephantom 我已经在函数中添加了代码。 你为什么使用format("com.github.saurfang.sas.spark")
?这不是镶木地板...我认为您可能需要查看 inferDecimal
和该格式的其他选项
@AlexOtt 抱歉粘贴了 sas 文件加载,现在更新了 parquet 文件加载。
【参考方案1】:
您可以使用 StructType 定义架构,然后在加载数据时在架构选项中提供此架构。
from pyspark.sql.types import StructType, StructField, IntegerType, StringType, DoubleType
fileSchema = StructType([StructField('atm_id', StringType(),True),
StructField('atm_street_number', IntegerType(),True),
StructField('atm_zipcode', IntegerType(),True),
StructField('atm_lat', DoubleType(),True),
])
df_raw_data = spark.read \
.option("header",True) \
.option("format", "parquet") \
.schema(fileSchema) \
.load(data_filename[5:])
【讨论】:
以上是关于Inferschema 检测列作为字符串而不是来自 pyspark 中镶木地板的双精度的主要内容,如果未能解决你的问题,请参考以下文章
Pandas 映射到 TRUE/FALSE 作为字符串,而不是布尔值
按数据类型而不是来自 AJAX 的格式化字符串对 DataTables 中的列进行排序
使用“party”包运行“ctree”,列作为因子而不是字符
MUIDataTable : onRowclick 在可选择的工具提示中显示来自 json 的数据,而不是作为一列
使用 spark.read.format("com.crealytics.spark.excel") 的 inferSchema 推断日期类型列的双精度