从Azure Databricks DBFS REST 2.0 API读取文件

时间:2019-01-22 17:54:55

标签: azure-databricks

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

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

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

但是在第二次及以后的数据迭代中,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编写的代码示例,但没有帮助。

我不是想浪费任何人的时间。但是,请有人帮助我找出问题出在哪里,或者我可以遵循的其他任何标准程序?

1 个答案:

答案 0 :(得分:0)

我遇到过相同类型的问题,并通过迭代提取来解决。

但是,要使其正常工作,我必须从0提取到1000000,然后从1000000提取到文件末尾。

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

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