我正在尝试从Kinesis读取流JSON数据到PySpark。我的JSON看起来像:
{'installmentNo': '10', 'loanId': '1'}
我已经指定了架构,但是当spark读取数据时我得到了“ null”。下面是代码段。
from pyspark.sql.types import *
from pyspark.sql.functions import from_json
fields = [
StructField("installmentNo", IntegerType(), True),
StructField("loanId", IntegerType(), True)
]
pythonSchema = StructType(fields)
kinesisDf = spark.readStream \
.format("kinesis")\
.option("streamName", kinesisStreamName)\
.option("region", kinesisRegion)\
.option("initialPosition", "latest")\
.option("awsAccessKey", awsAccessKeyId)\
.option("awsSecretKey", awsSecretKey).load()
dataDevicesDF = kinesisDf.selectExpr("cast (data as STRING) my_json_data").select(from_json("my_json_data", pythonSchema).alias("yp_inst")).select("yp_inst.*")
display(dataDevicesDF)
输出:
但是,当我删除“ from_json”部分时,我得到了带有JSON字符串的单列。但是我想将json分解为特定的列,并以df格式获取数据。有人可以建议我更改吗?
答案 0 :(得分:1)
该模式不正确-您声明整数时,数据是字符串。
请将定义更改为
pythonSchema = StructType([
StructField("installmentNo", StringType(), True),
StructField("loanId", StringType(), True)
])
并强制输出:
from_json(
"my_json_data", pythonSchema
).cast("struct<installmentNo: integer, loanId: integer>"))
其余代码应保持原样,尽管为清楚起见,您可以显式设置选项(因为输入不是标准JSON):
from_json(
"my_json_data", pythonSchema, {"allowSingleQuotes": "true"}
).cast("struct<installmentNo: integer, loanId: integer>"))