当前位置: 首页 > 知识库问答 >
问题:

如何联合两个火花Dataframe与类型结构,可以不同的字段?

栾耀
2023-03-14

我对Apache Spark很陌生,有时仍在努力。我正在尝试导入一个非常复杂的json文件,并在将其保存到拼花文件之前将其展平。

我的json文件是一个存储树。

{
"id": "store02",
"name": "store name",
"domain": "html" target="_blank">domain",
"currency": "EUR",
"address1": "Somewhere",
"country": "GER",
"city": "Berlin",
"zipCode": "12345",
"timeZone": "CET",
"accounts" : [
    {
        "field1": "",
        "filed2": "",
        "field3": "",
        "optionnalArray1": [
            {
                "field1": "",
                "field2": ""
            }
        ],
        "optionnalArray2": ["aa", "bb"]
    }
],
"stores": [ .... ]    
}

每个商店都可以有一个字段,该字段是一个帐户数组。一个帐户有3个必填字段和两个可选字段。所以我有一个数据框,它的字段可以有3种不同的类型。

在数据帧中导入文件并没有什么大不了的,但在扁平化过程中,我可能希望对两个数据帧进行联合,这两个数据帧的帐户可能具有不同的架构,当然,我有以下错误:“只能对具有兼容列类型的表执行联合”

有没有办法轻松地做到这一点?spark如何能够毫无问题地导入这样的json文件?

@拉梅什

假设我有两个数据帧。第一个是无帐户存储的数据帧。第二个是包含帐户的存储的数据框架。帐户是这样定义的结构:

val acquirerStruct = StructType(
    StructField("merchantId", StringType, nullable = true) ::
    StructField("name", StringType, nullable = true) ::
    Nil)

val accountStruct = StructType(
    StructField("acquirers", ArrayType(acquirerStruct), nullable = true) ::
        StructField("applicationCode", StringType, nullable = true) ::
        StructField("channelType", StringType, nullable = true) ::
        StructField("id", StringType, nullable = true) ::
        StructField("terminals", ArrayType(StringType), nullable = true) ::
        Nil)

当我想要合并这两个数据帧时,我会在之前为我的第一个数据帧创建一个列帐户:

df1.withColumn("account", array(lit(null).cast(accountStruct))).union(df2)

如果在df2中,所有行都有一个与accountStruct具有相同结构的帐户,那么它可以正常工作。但这并不总是正确的。账户可能没有终端或收单机构。这在json中完全有效。在这种情况下,我有前面提到的错误。

"Union can only be performed on tables with the compatible column types"

共有1个答案

凤柏
2023-03-14

我在PySpark中遇到了同样的问题,我通过在读取不兼容的数据帧时提供模式来解决它

import copy
...
schema_to_read = copy.deepcopy(df1.schema)
df2 = sql_context.read.format("json").schema(schema_to_read).load(path)
 类似资料:
  • 问题内容: 看这个: 现在,我有了一些值和一个从文件中加载的值的实例化。我希望将两个结构合并到一起,以便同时获取两个结构的内容。应该覆盖设置的任何内容,而 可能没有设置所有的字段 。(为什么?因为潜在的用户可能不知道默认值,所以删除该条目等同于设置默认值-我认为) 我认为我需要对此进行反思: 在这里我不确定: 如果根本需要反思 可能有更简单的方法可以做到这一点 我在这里看到的另一个问题是检查零值可

  • 我在火花数据帧中有一个“结构类型”列,它有一个数组和一个字符串作为子字段。我想修改数组并返回相同类型的新列。我可以用UDF处理它吗?或者有什么替代方案? 似乎我需要行类型的UDF,类似 这是有意义的,因为Spark不知道返回类型的模式。不幸的是,udf.register也失败了:

  • 问题内容: 在我的猪代码中,我这样做: 我想用spark做同样的事情。但是,不幸的是,我看到我必须成对进行: 是否有联合运算符可以让我一次对多个rdds进行操作: 例如 这是一个方便的问题。 问题答案: 如果这些是RDD,则可以使用方法: 没有等效项,但这只是一个简单的问题: 如果要在RDD上大量使用和重新创建,可能是避免与准备执行计划的成本相关的问题的更好选择:

  • 但是,要添加到我的txt文件中的事务列表的类型是Transaction,而不是String。 作为一个例子,这里有一些用户存款情况下的代码。 理想情况下,我希望代码读取用户以前的事务,将他们的新事务添加到txt文件的末尾,然后在用户完成时将所有这些事务保存到同一个txt文件中。有没有一种方法可以读取用户以前的事务类型为Transaction而不是String,或者以某种方式将这两个列表组合起来,给

  • 我正在尝试合并两个不同类型的列表。我得到了两个不同的API响应从改造在一个android应用程序,第一个列表是一个电影列表定义为 公共类列表{ 我通过以下操作成功地从API中检索到列表 然后,我尝试将一个类型列表和一个类型字符串列表组合起来,以创建一个新类ListingAndImage(字符串是一个URL,我将加载到imageview中) 我的问题是,哪种方式最好将这两个列表组合起来,形成一个列表

  • 我在我们的项目中使用了HDFS上的Apache spark和MapR。我们正面临着运行火花工作的问题,因为它在数据小幅增加后失败了。我们正在从csv文件中读取数据,做一些转换,聚合,然后存储在HBASE中。 请建议,如果上面的配置看起来很好,因为am geting的错误看起来像是要离开内存。