Pyspark从JSON文件获取Schema

slsn1g29  于 2023-08-02  发布在  Spark
关注(0)|答案(3)|浏览(135)

我试图从JSON文件中获取Pyspark模式,但当我使用Python代码中的变量创建模式时,我能够看到<class 'pyspark.sql.types.StructType'>的变量类型,但当我试图通过JSON文件时,它显示unicode的类型。
有没有办法通过JSON文件获取pyspark模式?

JSON文件内容:

{                                                                                                                                                                                                
"tediasessionclose_schema" : "StructType([ StructField('@timestamp', StringType()), StructField('message' , StructType([ StructField('componentAddress', StringType()), StructField('values', StructType([ StructField('confNum', StringType()), StructField('day', IntegerType())])"                                                                                                                                                         
}

字符串

Pyspark代码:

df = sc.read.json(hdfs_path, schema = jsonfile['tediasessionclose_schema'])

wqsoz72f

wqsoz72f1#

你可以通过计算你从json中得到的字符串来获得schema:

import json
from pyspark.sql.types import StructField, StringType, IntegerType, StructType

with open('test.json') as f:
    data = json.load(f)

df = sqlContext.createDataFrame([], schema = eval(data['tediasessionclose_schema']))
print(df.schema)

字符串
产出:

StructType(List(StructField(@timestamp,StringType,true),StructField(message,StructType(List(StructField(componentAddress,StringType,true),StructField(values,StructType(List(StructField(confNum,StringType,true),StructField(day,IntegerType,true))),true))),true)))


其中test.json是:

{"tediasessionclose_schema" : "StructType([ StructField('@timestamp', StringType()), StructField('message' , StructType([ StructField('componentAddress', StringType()), StructField('values', StructType([ StructField('confNum', StringType()), StructField('day', IntegerType())]))]))])"}


希望这对你有帮助!

xu3bshqb

xu3bshqb2#

config_json文件:

{"json_data_schema": ["contactId", "firstName", "lastName"]}

字符串
PySpark应用程序:

schema = StructType().add("contactId", StringType()).add("firstName", StringType()).add("lastName", StringType())


参考:https://www.python-course.eu/lambda.php

schema = StructType()
schema = map(lambda x: schema.add(x, StringType(), True), (data["json_data_schema"]))[0][0:]


希望这个解决方案对你有用!

twh00eeo

twh00eeo3#

这里不需要做任何手工操作。Spark内置了一个功能,可以读取JSON字符串,推断其模式并将其转换为Struct格式。
只需将JSON数据读取到单列dataframe - df中,下面是接下来可以使用的语句:
第一个月

相关问题