程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Pyspark - 读取 json 文件并返回数据帧大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Pyspark - 读取 json 文件并返回数据帧?

开发过程中遇到Pyspark - 读取 json 文件并返回数据帧的问题如何解决?下面主要结合日常开发的经验,给出你关于Pyspark - 读取 json 文件并返回数据帧的解决方法建议,希望对你解决Pyspark - 读取 json 文件并返回数据帧有所启发或帮助;

我正在尝试使用 pyspark 在下面阅读的 JsON

test.Json
{
  "transactions": [
    {
      "ST": {
        "ST01": { "type": "271"},"ST02": {"type": "1001"},"ST03": {"type": "005010X279A1"}
      }
    }
  ]
}
+++++++++++++++++++++++++++++++++++
from pyspark.sql.types import *
from pyspark.sql import SparkSession
from pyspark.sql import functions as F

spark = SparkSession.builder.appname("Spark - JsON read").master("local[*]") \
    .config("spark.driver.bindAddress","localhost") \
    .getorCreate()

ST = StructType([
        StructFIEld("ST01",StructType([StructFIEld("type",StringType())])),StructFIEld("ST02",StructFIEld("ST03",])
ST1 = StructType([
        StructFIEld("ST01",StringType()),])

Json_scheR_354_11845@a = StructType()
Json_scheR_354_11845@a.add("ST",ST1)
# Json_scheR_354_11845@a.add("ST",ST)
scheR_354_11845@a = StructType([StructFIEld("transactions",ArrayType(Json_scheR_354_11845@a))])
df1 = spark.read.option("multiline","true").Json("test.Json",scheR_354_11845@a = scheR_354_11845@a)
df1.SELEct(F.explode("transactions")).SELEct("col.*").SELEct("ST.*").show(truncate=falsE)

我想要的输出就像下面的类型值必须是列值

+-----+------+------------+
|ST01 |ST02  |ST03        |
+-----+------+------------+
|271  |1001  |005010X279A1|
+------------+------------+

但使用 ST 或 ST1 架构

With ST --> each column is a struct fIEld
+-----+------+--------------+
|ST01 |ST02  |ST03          |
+-----+------+--------------+
|[271]|[1001]|[005010X279A1]|
+-----+------+--------------+

With ST1 --> its a JsON value for ST01,ST02 and ST03 cols
+--------------+---------------+-----------------------+
|ST01          |ST02           |ST03                   |
+--------------+---------------+-----------------------+
|{"type":"271"}|{"type":"1001"}|{"type":"005010X279A1"}|
+--------------+---------------+-----------------------+

我可以做 ST01.* 并为其取别名,但我作为输入获得的 JsON 是动态的,它可能包含也可能不包含所有三个标签。

有什么想法吗?

解决方法

由于您的 JSON js 是动态的并且可能不包含所有三个标签,因此一种“动态”方法是对现有列使用 for 循环。一旦有了列名,你就可以extract JSON object或using expression,像这样

df2 = df1.SELEct(F.explode("transactions")).SELEct("col.*").SELEct("ST.*")

# with ST scheR_354_11845@a (struct typE)
for col in df2.columns:
  df2 = df2.withcolumn(col,F.expr(f'{Col}.type'))

# with ST1 scheR_354_11845@a (JSON String typE)
for col in df2.columns:
  df2 = df2.withcolumn(col,F.get_json_object(col,'$.type'))

结果:

+----+----+------------+
|ST01|ST02|ST03        |
+----+----+------------+
|271 |1001|005010X279A1|
+----+----+------------+

大佬总结

以上是大佬教程为你收集整理的Pyspark - 读取 json 文件并返回数据帧全部内容,希望文章能够帮你解决Pyspark - 读取 json 文件并返回数据帧所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。