apache-spark - 由于列损坏,无法打开或查询 .parquet 文件

标签 apache-spark parquet azure-data-lake azure-stream-analytics azure-synapse

我正在将 JSON 遥测数据从 Azure 流分析发送到序列化为 .parquet 文件的 Azure Data Lake Gen2。然后,我通过数据湖在 Azure Synapse Serverless SQL 池中创建了一个 View ,可以连接到该 View 并查询报告数据。

每隔一段时间我就会运行一个查询并返回以下错误:

Error handling external file: 'Invalid metadata in parquet file. Number of rows in metadata does not match actual number of rows in parquet file.'. File/External table name: 'https://test123.dfs.core.windows.net/devicetelemetry/2021/12/03/20/-1875592941_d9a0239529f04e1eb587b83d50bbb590_1.parquet'.

当我尝试使用“Apache Parquet Viewer”或任何其他 parquet 查看器打开有问题的 .paqruet 文件时,它会出错并拒绝打开该文件,提示名为“data”的列未定义。数据列是一个 JSON 字符串,其中包含来自 IoT 设备的各种传感器读数。

将数据发送到 ADLS 的 StreamAnalytics 查询如下所示:

SELECT 
  Tel.identities.corporationId AS corporationId, Tel.identities.deviceId, 
  Tel.deviceTelemetry.version, Tel.deviceTelemetry.TimeStamp AS dateTimeStamp, 
  Tel.deviceTelemetry.data
INTO 
  deviceTelemetryADLS
FROM 
  data AS Tel 
WHERE Tel.deviceTelemetry.data IS NOT null

问题

这里使用的 WHERE 子句难道不能确保数据始终存在吗?不然不会寄出去?否则我的 .parquet 文件怎么会被损坏?

最佳答案

有问题的“数据”列是动态对象的嵌套 JSON 数组,SA 似乎无法将其正确转换为 parquet 格式。我们最终要做的是创建一个流分析函数,该函数接收该数组并将其转换为字符串

函数

function main(InputJSON) {
  var InputJSONString = JSON.stringify(InputJSON);
  return InputJSONString;
}

查询

Tel.identities.corporationId AS corporationId, Tel.identities.deviceId, Tel.deviceTelemetry.version, Tel.deviceTelemetry.TimeStamp AS dateTimeStamp, udf.ConvertToJSONString(Tel.deviceTelemetry.data) as deviceData
INTO 
    deviceTelemetryADLS
FROM 
    data AS Tel 
WHERE Tel.deviceTelemetry.data IS NOT null 

因此,我们将这个嵌套的 JSON 作为单个列存储在 SQL 中,因为我们不需要为这些“数据”字段建立索引。当向我们的 .NET 应用程序查询它时,我们将其反序列化为一个对象

关于apache-spark - 由于列损坏,无法打开或查询 .parquet 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70230542/

相关文章:

postgresql - 用于 spark/hadoop 的 Postgres 适配器增加了什么值(value)?

java - 如何使用数据集聚合 spark(java) 中的字符串计数

apache-spark - 在 Spark SQL 中使用 Avro 模式和 Parquet 格式进行读/写

arrays - 从配置单元中的非嵌套数据创建嵌套数据

mysql - 使用条件从分区的 Parquet 数据创建表

scala - 是否可以访问 spark.ml 管道中的估算器属性?

hadoop - 为 AvroParquetInputFormat 设置多个 projectionSchemas 的问题

azure-functions - 使用 Azure 函数处理 Azure Datalake 存储文件

apache-spark - Delta Lake 中的外部表与内部表

c# - VS 更新破坏了 microsoft.analytics.dll