我已经设置了自动加载器来定期读取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"
}
}
}
]
}
分配数据帧的大小和调用数据帧之间存在差异。请在加入之前检查分配数据帧大小和调用数据帧。请仔细阅读官方文件。我在我的环境中使用示例代码遵循了相同的场景。我加了一张银色桌子,它对我来说很好,没有错。遵循此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