Python 将非结构化模式读入Spark

Python 将非结构化模式读入Spark,python,scala,apache-spark,pyspark,Python,Scala,Apache Spark,Pyspark,我有一些数据的结构基本上是一致的,但有一个特定的领域可能是几种不同结构中的一种,我不确定如何处理这个问题。您可以想象数据是这样进来的,col_2的结构是三种不同类型中的一种: {"col_1": "a", "col_2": "b"} # type 1 {"col_1": "b", "col_2": [{"subcol_1": "

我有一些数据的结构基本上是一致的,但有一个特定的领域可能是几种不同结构中的一种,我不确定如何处理这个问题。您可以想象数据是这样进来的,
col_2
的结构是三种不同类型中的一种:

{"col_1": "a", "col_2": "b"}  # type 1
{"col_1": "b", "col_2": [{"subcol_1": "c"}, {"subcol_1": "d"}]}  # type 2
{"col_1": "c", "col_2": {"subcol_2": "e", "subcol_3": "f"}}  # type 3
考虑到这似乎意味着
col_2
将是一种混合类型,将其读入spark的最佳方法是什么?理想情况下,我希望能够在经过一些操作后将其转储回JSON,并将其存储为字符串似乎很笨拙。一个好处是我能够将
col_1
col_2
的类型关联起来,即当
col_1
=='a'时,
col_2
始终是类型1,以此类推


现在我在Scala中工作,但如果出于某种原因,这在Pyspark中是可行的,但在Scala中不可行,那也没关系。

问题是,给你的输入列一个json字符串,你可以使用来自_json的函数转换成StructTypeArrayType(StructType)列。但是,因为有三种不同的格式,所以有两种选择:

  • 创建可以表示这三种格式的全局模式。缺少的键将用null填充。然后,您可以使用when函数进行过滤,以创建三个不同的列

  • 使用UDF(或三个)创建所需的输出


  • 我认为这是两种主要的可能性。

    spark并不是为灵活的模式而设计的…@mck这似乎也是我在这里发现的。多个全局模式似乎有点过头了。我对UDF很熟悉,你提供了一个例子,说明你在这里如何应用它?