【问题标题】:PySpark issue loading json data with schemaPySpark 使用模式加载 json 数据的问题
【发布时间】:2016-09-01 02:05:17
【问题描述】:

我的 json 数据看起来像这样(每行 1 个对象):

{
  "id": "c428c2e2-c30c-4864-8c12-458ead4b17f5",
  "weight": 73,
  "topics": {
    "type": 1,
    "values": [
      1,
      2,
      3
    ]
  }
}

当我在没有指定架构的情况下读取数据时,Spark 将 topics.values 推断为 ArrayType,但我需要它作为 VectorUDT 来执行 ML 任务。所以我尝试使用如下模式读取数据集:

    schema = StructType([
        StructField("id", StringType()),
        StructField("weight", IntegerType()),
        StructField("topics", StructType([
            StructField("type", IntegerType()),
            StructField("values", VectorUDT())
        ]))
    ])

当我这样做时,我看到数据框的类型(使用dtype)如下:

[('id', 'string'), ('weight', 'int'), ('topics', 'struct<type:int,values:vector>')]

但数据框中似乎没有实际数据,如使用first()所示:

Row(id=None, weight=None, topics=None)

当我将数据帧写入磁盘时,我只看到每一行都有空括号。似乎很奇怪!我做错了什么?

【问题讨论】:

  • 这并不奇怪。您传递的模式不适用于 JSON 文档。
  • @LostInOverflow 你能详细说明一下吗?显然我在这里问一个问题,因为我不知道。
  • @LostInOverflow 好吧,您的评论确实让我意识到如何正确地做到这一点。非常感谢。
  • 很高兴它有帮助,很抱歉我没有更明确的建议。

标签: apache-spark pyspark


【解决方案1】:

好吧,我想通了:

只需要稍微改变一下架构:

schema = StructType([
                StructField("id", StringType()),
                StructField("weight", DoubleType()),
                StructField("topics", VectorUDT())
            ])

现在说得通了。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 2019-02-13
  • 2018-01-20
  • 2013-03-08
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多