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

Databricks Delta Live表中对字段StructField的引用不明确

景阳平
2023-03-14

我已经设置了自动加载器来定期读取json文件,并使用Database ricks中的Delta Live Tables将它们存储在一个名为fixture_raw的“青铜”表中。这很好用,json数据存储在指定的表中,但是当我添加一个名为fixture_prepared的“银”表并尝试从青铜表中提取一些json元素时,我收到一个错误:

org.apache.spark.sql.AnalysisException: Ambiguous reference to fields StructField(id,LongType,true), StructField(id,LongType,true)

我该如何解决这个问题?

Delta Live Table代码:

CREATE OR REFRESH STREAMING LIVE TABLE fixture_raw AS 
SELECT *, input_file_name() AS InputFile, now() AS LoadTime FROM cloud_files(
  "/mnt/input/fixtures/", 
  "json",
  map(
    "cloudFiles.inferColumnTypes", "true",
    "cloudFiles.schemaLocation", "/mnt/dlt/schema/fixture",
    "cloudFiles.schemaEvolutionMode", "addNewColumns"
  )
);

CREATE OR REFRESH LIVE TABLE fixture_prepared AS
WITH FixtureData (
  SELECT 
    explode(response) AS FixtureJson
  FROM live.fixture_raw
)
SELECT
  FixtureJson.fixture.id AS FixtureID,
  FixtureJson.fixture.date AS StartTime,
  FixtureJson.fixture.venue.name AS Venue,
  FixtureJson.teams.home.id AS HomeTeamID,
  FixtureJson.teams.home.name AS HomeTeamName,
  FixtureJson.teams.away.id AS AwayTeamID,
  FixtureJson.teams.away.name AS AwayTeamName
FROM FixtureData;

Json数据:

{
    "get": "fixtures",
    "parameters": {
        "league": "39",
        "season": "2022"
    },
    "response": [
        {
            "fixture": {
                "id": 867946,
                "date": "2022-08-05T19:00:00+00:00",
                "venue": {
                    "id": 525,
                    "name": "Selhurst Park"
                }
            },
            "teams": {
                "home": {
                    "id": 52,
                    "name": "Crystal Palace"
                },
                "away": {
                    "id": 42,
                    "name": "Arsenal"
                }
            }
        },
        {
            "fixture": {
                "id": 867947,
                "date": "2022-08-06T11:30:00+00:00",
                "venue": {
                    "id": 535,
                    "name": "Craven Cottage"
                }
            },
            "teams": {
                "home": {
                    "id": 36,
                    "name": "Fulham"
                },
                "away": {
                    "id": 40,
                    "name": "Liverpool"
                }
            }
        }
    ]
}

共有1个答案

丘华翰
2023-03-14

分配数据帧的大小和调用数据帧之间存在差异。请在加入之前检查分配数据帧大小和调用数据帧。请仔细阅读官方文件。我在我的环境中使用示例代码遵循了相同的场景。我加了一张银色桌子,它对我来说很好,没有错。遵循此GitHub参考,它有详细信息。

参考:

https://learn.microsoft.com/en-us/azure/databricks/data-engineering/delta-live-tables/delta-live-tables-quickstart#sql

Delta Live Tables演示:用于ETL处理的现代软件工程。

 类似资料:
  • 我在尝试展平高度嵌套的结构时遇到以下错误: 组织。阿帕奇。火花sql。AnalysisException:对字段StructField(错误、StructType(数组、ArrayType(StructType(double,DoubleType,true)、StructField(int,IntegerType,true)、StructField(string,StringType,true))

  • 问题内容: 我正在尝试获取离开此评论的用户的用户信息。 使用以下代码: 我得到了错误: 字段列表中的“ user_id”列不明确 这是什么意思? 问题答案: 这意味着查询中的两个表都具有column 。 您需要在SELECT语句中指定要获取的对象,例如

  • 问题内容: 我有2张桌子。并且两者都有。如何选择字段,因为我总是会收到此错误: 这是我的查询: 我可以选择所有字段并避免错误。但这将浪费性能。我该怎么办? 问题答案: SQL通过给引用加上完整的表名作为前缀来支持对列进行限定: …或表别名: 推荐使用表别名-为什么键入的文字比您需要的多? 为什么这些查询看起来不同? 其次,我的答案使用ANSI-92 JOIN语法(您使用的是ANSI-89)。尽管它

  • 问题内容: 最近,我发现匿名类和lambda表达式之间有细微的区别: 通常,lambda与匿名类等效。甚至我的Eclipse IDE都具有重构功能,可以将转换为lambda(变得完全像)并转换为匿名类(变得完全像)。但是lambda给了我一个编译错误,而匿名类却可以完美地编译。错误消息如下所示: 所以问题是:为什么会有这种差异? 问题答案: 这与处理前向引用的JLS#8.3.3有关。特别是,如果使

  • 如果我在一个类中有以下语句,其中Synapse是一个抽象类型: 最终是否允许我仍然能够更改列表中Synapse对象的状态,但阻止我向列表中添加新的Synapse对象?如果我错了,请您解释一下final正在做什么,以及我应该在什么时候使用关键字final。

  • 给定下面用Mockito模拟Scala类的代码,我会得到一个错误并且无法编译: 错误是: 对重载定义的引用不明确,类型为(x$1:class[common.testeable],x$2:org.Mockito.mocksettings)的对象Mockito中的方法mock和类型为(x$1:class[common.testeable],x$2:org.Mockito.stubbing.answhe