当前位置: 首页 > 知识库问答 >
问题:

在pyspark中读取嵌套的JSON文件,其中structType列的值为string

太叔昊苍
2023-03-14

{“traffic\u fource”:“{name':'intgreints',medium':'(none)',source':'(direct)}}”

这是一个拼花文件,它有json格式的数据,但值部分在双引号中,这使它成为一个字符串而不是StructType,我想不知道它在诸如traffic\u fource\u name和value等列之间有“_”将是int,然后traffic\u fource\u medium,值将是(none)。我已经有了一个函数,只有当它识别出数据类型是structType或ArrayType时,才会按我的需要取消对其进行测试,但在这里,我用双引号括起了值。因此,我已经完成了以下步骤,以将其识别为结构类型:

        schema_traffic = StructType([StructField("name",StringType()),StructField("medium",StringType()),StructField("source",StringType())])
        df = df.withColumn("traffic_source", from_json(inp_df.traffic_source, schema_traffic))

这很好用。但我面临的问题是,当我试图通过参数文件传递模式时。模式始终为字符串格式,其中from_json失败。从param文件中读取模式后,看起来如下所示:

“StructType([StructField(“name”,StringType()),StructField(“medium”,StringType()),StructField(“source”,StringType())])”

共有2个答案

元彦君
2023-03-14

读取文件时,内容将仅推断为字符串。

您可以使用如下所示内容的配置文件。添加列名和相应类型:

name:string
medium:string
source:string

读取此文件并动态创建StructType架构。我使用简单的文件读取器来读取和解析配置,如果需要,您可以使用任何其他配置解析器库。

type_to_spark = {"int": IntegerType(), "string": StringType()}

with open("config.conf") as f:
    contents = f.read().splitlines()

def prepare_struct(config_lines):
    configs = config_lines.split(":")
    return StructField(configs[0], type_to_spark[configs[1]])

schema = StructType(list(map(lambda s: prepare_struct(s), contents)))

# Now pass this schema to from_json

您可以将DDL字符串形式的架构传递给from_json。示例代码:

>>> df = spark.createDataFrame([('{"id": 1,"name": {"fn": "jk","ln": "jh"}}',)]).toDF("json")
>>> df.show(truncate=False)
+-----------------------------------------+
|json                                     |
+-----------------------------------------+
|{"id": 1,"name": {"fn": "jk","ln": "jh"}}|
+-----------------------------------------+

>>> outDF = df.select(from_json("json","id int, name struct<fn:string,ln:string>"))
>>> outDF.show()
+---------------+
|from_json(json)|
+---------------+
|  {1, {jk, jh}}|
+---------------+

>>> outDF.printSchema()
root
 |-- from_json(json): struct (nullable = true)
 |    |-- id: integer (nullable = true)
 |    |-- name: struct (nullable = true)
 |    |    |-- fn: string (nullable = true)
 |    |    |-- ln: string (nullable = true)

您可以将ddl模式放在一个文件中,然后读取该文件,将模式存储在一个变量中,并将模式变量传递给from_json。

林丁雷
2023-03-14

太棒了。我确实有嵌套的列,所以如果我必须再次使用结构类型,那么我可以怎么做:“FireAnalyse": "[{'值”:“firebase_previous_screen”,“键”:{'string_value':“NewUser”,“int_value”:“无”,“float_value”:“无”,“double_value”:“无'}}, {'值”:“firebase_previous_class”,“键”:{'string_value':“用户详细信息”,“int_value”:“无”,“float_value”:无,“double_value”:无}]”

所以首先我删除了数组括号:inp_df=inp_df.with列("FireAnalyse",func.split(inp_df['FireAnalyse'], ']')[0])inp_df=inp_df.with列("FireAnalyse",func.split(inp_df['FireAnalyse'], '[')[1])

        schema = StructType([StructField("key",StringType()),StructField("value",StructType([StructField("string_value",StringType()),StructField("int_value",IntegerType()),StructField("float_value",FloatType()),StructField("double_value",DoubleType())]))])
        inp_df = inp_df.withColumn("event_params", from_json(inp_df.event_params, schema))
 类似资料:
  • 我试图在ObjectMapper的帮助下读取一个json文件(schools.json)。json的文件结构如下所示: 这个json文件是从java读取的,如下所示: 现在,上面的java代码块不工作了。schools对象返回NULL。 我不能让这个工作。我发现了一些json字段包含数组的例子,但我不能将类似的逻辑应用到我的例子中。感谢你的帮助。

  • 我这里有一个很长的json:https://textup.fr/601885q4我想读一个“支付令牌合同”中的数据,特别是那些带有“id”的数据:1我的问题是,我不知道如何称呼特定的词汇,因为它们都有相同的名称。这是否可能,我还不习惯操作如此复杂的对象,因为我是初学者。我会尝试像:[“订单][x][“id”:1][“基本价格”]这样的东西,x是一个for循环,循环遍历每个“订单”显示。但是我无法将

  • 我是一个新的Java程序员,来自Python背景。我有天气数据被收集/返回为一个JSON嵌套键,我不明白如何在这种情况下拉出值。我肯定这个问题以前有人问过,但是我发誓我已经谷歌了很多,似乎找不到答案。现在我使用的是json-简单,但我尝试切换到Jackson,但仍然不知道如何做到这一点。由于Jackson/Gson似乎是最常用的库,我希望看到使用其中一个库的示例。下面是数据的示例,后面是我到目前为

  • 我的json结构如下: 表示JSON继续使用更多。我想从这个JSON中检索。我的代码如下所示: 但是,使用此代码,将始终 我尝试了不同的路径,但总是得到一个空的

  • 问题内容: 我是来自Python的新Java程序员。我有正在收集/返回为带有嵌套键的JSON的天气数据,而且我不了解在这种情况下如何提取值。我敢肯定这个问题已经被问过了,但是我发誓我已经用Google搜索了很多东西,但是我似乎找不到答案。现在我正在使用json- simple,但我尝试切换到Jackson,但仍然不知道如何执行此操作。由于Jackson / Gson似乎是使用最频繁的库,因此,我很

  • 问题内容: 我有以下JSON,如下所示。我正在尝试读取值TOP1,TOP2。我不太确定该如何做。 我正在使用以下..但这只是给我一个对象,该对象具有用于TOP1和TOP2的嵌套对象。如何获取值TOP1和TOP2? 和下面的数据 问题答案: 您似乎想通过循环,因此请更改以下内容: 对此: 现在,您正在使用该对象遍历该对象数组, 这些 对象就是具有属性的对象,例如:和。