首页 > 解决方案 > 从 Azure Databricks DBFS REST 2.0 API 读取文件

问题描述

我正在开发一个使用 Azure Databricks DBFS API 2.0 读取和写入文件的应用程序。此 API 的参考文档: https ://docs.azuredatabricks.net/api/latest/dbfs.html#read

我可以通过将文件转换为base64然后分成1MB的数据块来上传文件(比如说1.4MB的文件)。

由于读取长度限制为 1MB,我正在迭代一个循环以从 offset和 to读取0数据。现在数据的第一次迭代-是有效的,我可以从我用于上传的原始文件中确认。10000001000001end of the file01000000

但是第二次及以后的数据迭代,base64数据完全不同,并且不存在于原始base64文件中。

以下是我的测试代码: Second iteration- 0.4MB

const axios = require('axios')
const fs = require('fs')

axios({
  method: 'get',
  url: 'https://********.azuredatabricks.net/api/2.0/dbfs/read',
  data: {
    path: '/Test/backlit-beach-clouds-1684881.jpg',
    offset: 0,
    length: 1000000
  },
  headers: {
    'Authorization': `Bearer ****`
  }
}).then(({data}) => {
  if (data) {
    console.log('Success', data.bytes_read)
    fs.writeFile('./one.txt', data.data, function (err) {
      console.log('done', err)
    })
  } else {
    console.log('failed')
  }
})

First iteration- 1MB

const axios = require('axios')
const fs = require('fs')

axios({
  method: 'get',
  url: 'https://********.azuredatabricks.net/api/2.0/dbfs/read',
  data: {
    path: '/Test/backlit-beach-clouds-1684881.jpg',
    offset: 1000001,
    length: 1000000
  },
  headers: {
    'Authorization': `Bearer ****`
  }
}).then(({data}) => {
  if (data) {
    console.log('Success', data.bytes_read)
    fs.writeFile('./two.txt', data.data, function (err) {
      console.log('done', err)
    })
  } else {
    console.log('failed')
  }
})

在这里,*** 被替换为相关的域和令牌。

如您所见,上述测试代码示例将生成one.txttwo.txt. 通过使用cat one.txt two.txt > final.txt我可以获得final.txt我将用来解码原始文件的内容。

由于这只是一个测试代码,我没有使用任何循环或更好的编码格式。这只是为了了解出了什么问题。

我坚持这个已经超过 1 周了。我指的是为 python 编写的其他代码示例,但没有帮助。

我不想浪费任何人的时间。但是,请有人帮我弄清楚出了什么问题或我可以遵循的任何其他标准程序吗?

标签: azure-databricks

解决方案


我已经运行了相同类型的问题并通过迭代提取来解决它。

但是,为了使其工作,我必须从 0 到 1000000 和 1000000 提取到文件末尾。

否则,base64 解码部分没有正确考虑第二个切片的开始。

我发现您不需要将这个额外的字节从一个切片添加到另一个切片。


推荐阅读