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

Pyspark:从 JSON 文件创建架构

景河
2023-03-14

我正在处理非常长的嵌套JSON文件中的数据。问题是,这些文件的结构并不总是相同的,因为有些文件缺少其他文件的列。我想从一个包含所有列的空JSON文件创建一个定制模式。如果我稍后将JSON文件读入这个预定义的模式,不存在的列将被空值填充(至少计划是这样的)。到目前为止我所做的:

  1. 将测试 JSON(不包含预期的所有列)加载到数据帧中
  2. 将其架构写入 JSON 文件
  3. 在文本编辑器中打开此 JSON 文件并手动添加缺少的列

接下来我想做的是通过将JSON文件读入我的代码来创建一个新架构,但是我在合成器上遇到了困难。是否可以直接从文件本身读取架构?我试过

schemaFromJson = StructType.fromJson(json.loads('filepath/spark-schema.json'))

但它给了我TypeError: init()缺少2个必需的位置参数:'doc'和'pos'

你知道我现在的代码有什么问题吗?非常感谢

编辑:我在 sparkbyexamples.com/pyspark/pyspark-structtype-and-structfield 遇到了这个链接。第7章几乎描述了我遇到的问题。我只是不明白如何解析我手动增强为模式的json文件从Json = 结构类型.从Json(json.loads(架构.json))。

当我这样做时:

jsonDF = spark.read.json(filesToLoad)
schema = jsonDF.schema.json()
schemaNew = StructType.fromJson(json.loads(schema))
jsonDF2 = spark.read.schema(schemaNew).json(filesToLoad)

代码可以运行,但显然没有用,因为jsonDF和jsonDF2有相同的内容/模式。我想要实现的是向“schema”添加一些列,然后这些列将反映在“schemaNew”中。

共有2个答案

周祺
2023-03-14

为什么不定义一个包含JSON文件可以包含的所有列的空DF呢?然后将JSONs加载到其中。这里有一个想法:

对于Spark 3.1.0:

from pyspark.sql.types import *

schema = StructType([
    StructField("fruit",StringType(),True),
    StructField("size",StringType(),True),
    StructField("color",StringType(),True)
])
df = spark.createDataFrame([], schema)

json_file_1 = {"fruit": "Apple","size": "Large"}
json_df_1 = spark.read.json(sc.parallelize([json_file_1]))

df = df.unionByName(json_df_1, allowMissingColumns=True)

json_file_2 = {"fruit": "Banana","size": "Small","color": "Yellow"}

df = df.unionByName(json_file_2, allowMissingColumns=True)

display(df)
翟嘉年
2023-03-14

我想我明白了。Schemapath包含已经增强的模式:

schemapath = '/path/spark-schema.json'
with open(schemapath) as f:
   d = json.load(f)
   schemaNew = StructType.fromJson(d)
   jsonDf2 = spark.read.schema(schmaNew).json(filesToLoad)
   jsonDF2.printSchema()
 类似资料:
  • 问题内容: 看起来像这样: 我使用以下代码加载 当我想要元素与JSON中出现的顺序相同时,为什么对元素进行排序。 派生JSON后,数据类型整数已转换为StringType,如何保留数据类型。 问题答案: 当我想要元素与json中出现的顺序相同时,为什么对架构元素进行排序。 因为不能保证字段顺序。尽管没有明确说明,但是当您看一下JSON阅读器doctstring中提供的示例时,它就会变得很明显。如果

  • 我想在一条消息中发送两个嵌入。这应该可以通过实现 此外,我还嵌入了如下JSON文件: 问题是,我想不起“如何将JSON文件转换为object”。我在JDA discord服务器中询问,在谷歌上搜索一些提示,但仍然无法想出正确的方法。 长话短说,我有一个用于嵌入的JSON文件,我想将JSON文件转换为对象,以便将其发送到Discord频道。

  • 我有2个数据文件: 1个文件是头文件,另一个是数据文件。头文件有2列(Id,标记):头。txt文件 现在我试图创建一个dataFrame Schema头文件:(我必须使用这种方法,因为在实时,有1000列header.txtdata.txt.所以,手动创建1000列的案例类是不可能的。 但是上面的行失败了,无法解决重载方法结构类型。 有人能帮忙吗

  • 我将JSON文件&JSON模式解析为AVRO模式。我有点困惑,我是否必须使用AVRO文档中定义的数据类型来编写手动AVRO模式。 或者是否有任何自动化的方法/函数/程序可以完全按照要求工作?

  • 我正在将数据写入s3 bucket,并使用pyspark创建parquet文件。我的桶结构如下所示: 子文件夹和表这两个文件夹应该在运行时创建,如果文件夹不存在,如果文件夹存在,则应该在文件夹表中创建拼接文件。 当我在本地计算机上运行pyspark程序时,它会用_$folder$(like)创建额外的文件夹,但是如果在emr上运行相同的程序,它会用_success创建。 是否有办法只在s3中创建文