我正在处理非常长的嵌套JSON文件中的数据。问题是,这些文件的结构并不总是相同的,因为有些文件缺少其他文件的列。我想从一个包含所有列的空JSON文件创建一个定制模式。如果我稍后将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”中。
为什么不定义一个包含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)
我想我明白了。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中创建文