一起使用 Azure Data Lakes 和 R Server 时等效的 readLines
readLines equivalent when using Azure Data Lakes and R Server together
使用 R Server,我只想从 Azure Data Lake 中读取原始文本(如 base 中的 readLines)。我可以像这样连接并获取数据:
library(RevoScaleR)
rxSetComputeContext("local")
oAuth <- rxOAuthParameters(params)
hdFS <- RxHdfsFileSystem(params)
file1 <- RxTextData("/path/to/file.txt", fileSystem = hdFS)
一旦执行该行,RxTextData
实际上并不会去获取数据,它更像是一个符号 link。当你 运行 这样的事情时:
rxSummary(~. , data=file1)
然后 从数据湖中检索数据。但是,它始终被读入并被视为带分隔符的文件。我想:
- 下载文件并用R代码存储在本地(最好不要)。
- 使用某种
readLines
等效项从中获取数据,但在 'raw' 中读取数据,以便我可以进行自己的数据质量检查。
现在有这个功能吗?如果是这样,这是怎么做到的?
编辑:我也尝试过:
returnDataFrame = FALSE
里面 RxTextData
。这个returns一个列表。但正如我所说,数据不会立即从数据湖中读取,直到我 运行 类似 rxSummary
的东西,然后尝试将其作为常规文件读取。
上下文:我有一个 "bad" CSV 文件,其中包含双引号内的换行符。这会导致 RxTextData 中断。但是,我的脚本会检测到这些事件并相应地修复它们。因此,我不希望 RevoScaleR 读取数据并尝试解释分隔符。
我找到了一种通过调用 Azure Data Lake Store REST API(改编自 GitHub 上 Hadley Wickham 的 httr
包中的演示)的方法:
library(httpuv)
library(httr)
# 1. Insert the app name ----
app_name <- 'Any name'
# 2. Insert the client Id ----
client_id <- 'clientId'
# 3. API resource URI ----
resource_uri <- 'https://management.core.windows.net/'
# 4. Obtain OAuth2 endpoint settings for azure. ----
azure_endpoint <- oauth_endpoint(
authorize = "https://login.windows.net/<tenandId>/oauth2/authorize",
access = "https://login.windows.net/<tenandId>/oauth2/token"
)
# 5. Create the app instance ----
myapp <- oauth_app(
appname = app_name,
key = client_id,
secret = NULL
)
# 6. Get the token ----
mytoken <- oauth2.0_token(
azure_endpoint,
myapp,
user_params = list(resource = resource_uri),
use_oob = FALSE,
as_header = TRUE,
cache = FALSE
)
# 7. Get the file. --------------------------------------------------------
test <- content(GET(
url = "https://accountName.azuredatalakestore.net/webhdfs/v1/<PATH>?op=OPEN",
add_headers(
Authorization = paste("Bearer", mytoken$credentials$access_token),
`Content-Type` = "application/json"
)
)) ## Returns as a binary body.
df <- fread(readBin(test, "character")) ## use readBin to convert to text.
您可以像这样使用 ScaleR 函数来完成。将分隔符设置为数据中未出现的字符,并忽略列名。这将创建一个包含单个字符列的数据框,您可以根据需要对其进行操作。
# assuming that ASCII 0xff/255 won't occur
src <- RxTextData("file", fileSystem="hdfs", delimiter="\x255", firstRowIsColNames=FALSE)
dat <- rxDataStep(src)
虽然 Azure Data Lake 确实是用来存储大数据集的,而这个似乎小到可以放入内存,但我想知道为什么你不能将它复制到本地磁盘....
使用 R Server,我只想从 Azure Data Lake 中读取原始文本(如 base 中的 readLines)。我可以像这样连接并获取数据:
library(RevoScaleR)
rxSetComputeContext("local")
oAuth <- rxOAuthParameters(params)
hdFS <- RxHdfsFileSystem(params)
file1 <- RxTextData("/path/to/file.txt", fileSystem = hdFS)
一旦执行该行,RxTextData
实际上并不会去获取数据,它更像是一个符号 link。当你 运行 这样的事情时:
rxSummary(~. , data=file1)
然后 从数据湖中检索数据。但是,它始终被读入并被视为带分隔符的文件。我想:
- 下载文件并用R代码存储在本地(最好不要)。
- 使用某种
readLines
等效项从中获取数据,但在 'raw' 中读取数据,以便我可以进行自己的数据质量检查。
现在有这个功能吗?如果是这样,这是怎么做到的?
编辑:我也尝试过:
returnDataFrame = FALSE
里面 RxTextData
。这个returns一个列表。但正如我所说,数据不会立即从数据湖中读取,直到我 运行 类似 rxSummary
的东西,然后尝试将其作为常规文件读取。
上下文:我有一个 "bad" CSV 文件,其中包含双引号内的换行符。这会导致 RxTextData 中断。但是,我的脚本会检测到这些事件并相应地修复它们。因此,我不希望 RevoScaleR 读取数据并尝试解释分隔符。
我找到了一种通过调用 Azure Data Lake Store REST API(改编自 GitHub 上 Hadley Wickham 的 httr
包中的演示)的方法:
library(httpuv)
library(httr)
# 1. Insert the app name ----
app_name <- 'Any name'
# 2. Insert the client Id ----
client_id <- 'clientId'
# 3. API resource URI ----
resource_uri <- 'https://management.core.windows.net/'
# 4. Obtain OAuth2 endpoint settings for azure. ----
azure_endpoint <- oauth_endpoint(
authorize = "https://login.windows.net/<tenandId>/oauth2/authorize",
access = "https://login.windows.net/<tenandId>/oauth2/token"
)
# 5. Create the app instance ----
myapp <- oauth_app(
appname = app_name,
key = client_id,
secret = NULL
)
# 6. Get the token ----
mytoken <- oauth2.0_token(
azure_endpoint,
myapp,
user_params = list(resource = resource_uri),
use_oob = FALSE,
as_header = TRUE,
cache = FALSE
)
# 7. Get the file. --------------------------------------------------------
test <- content(GET(
url = "https://accountName.azuredatalakestore.net/webhdfs/v1/<PATH>?op=OPEN",
add_headers(
Authorization = paste("Bearer", mytoken$credentials$access_token),
`Content-Type` = "application/json"
)
)) ## Returns as a binary body.
df <- fread(readBin(test, "character")) ## use readBin to convert to text.
您可以像这样使用 ScaleR 函数来完成。将分隔符设置为数据中未出现的字符,并忽略列名。这将创建一个包含单个字符列的数据框,您可以根据需要对其进行操作。
# assuming that ASCII 0xff/255 won't occur
src <- RxTextData("file", fileSystem="hdfs", delimiter="\x255", firstRowIsColNames=FALSE)
dat <- rxDataStep(src)
虽然 Azure Data Lake 确实是用来存储大数据集的,而这个似乎小到可以放入内存,但我想知道为什么你不能将它复制到本地磁盘....