提问者:小点点

spark.read拼花到数据框中给出空值


我是PySpark的新手,长话短说:我有一个镶木地板文件,我正在尝试阅读它并将其与SPARKSQL一起使用,但目前我可以:

  1. 读取带有架构的文件,但给出NULL值-spark.read. format
  2. 读取没有模式的文件(标题将第一行值作为列名)-read_parquet

我有一个镶木地板文件“位置.镶木地板”和

location_schema = StructType([ 
StructField("loc_id", IntegerType()), 
StructField("descr", StringType())

])

我一直在尝试阅读镶木地板文件:

location_df = spark.read.format('parquet') \
        .options(header='false') \
        .schema(location_schema) \
        .load("data/locations.parquet")

然后我将所有内容放入Temp表中以运行查询:

location_df .registerTempTable("location") 

但是在尝试运行查询后:

query = spark.sql("select * from location")
query.show(100)

它给我NULL值:

parque文件是正确的,因为我已经成功运行了这个:

great = pd.read_parquet('data/locations.parquet', engine='auto') 

但是read_parquet的问题(从我的理解)是我不能像spark.read. format那样设置模式。如果我在csv中使用spark.read.format,它也能成功运行并带来数据。

任何建议都非常感谢,谢谢。


共1个答案

匿名用户

location_df. schema给了我:结构类型(列表(结构字段(862,长类型,真),结构字段(动画,字符串类型,真))

您有一个带有数组的结构,而不仅仅是两列。这解释了为什么您的第一个示例为空(名称/类型不匹配)。如果您开始单独选择loc_iddesr,它也会引发错误。
结构数组中的字段名称似乎也是862动画,而不是您感兴趣的字段

您可以单独下载parquet-tools实用程序来检查文件数据并在没有Spark的情况下打印文件模式。在那里开始调试…

如果您没有为Spark阅读器提供架构,那么该信息已经从文件本身中隐藏,因为Parquet文件包含该信息(在文件的页脚中,而不是页眉中)