2017-02-14 62 views
1

Используя R Server, я хочу просто прочитать исходный текст (например, readLines в базе) из Azure Data Lake. Я могу подключиться и получить данные следующим образом:readLines эквивалент при использовании Azure Data Lakes и R Server вместе

library(RevoScaleR) 

rxSetComputeContext("local") 

oAuth <- rxOAuthParameters(params) 
hdFS <- RxHdfsFileSystem(params) 

file1 <- RxTextData("/path/to/file.txt", fileSystem = hdFS) 

RxTextData фактически не пойти и получить данные, когда эта строка выполняется, она работает как более символической ссылки. При запуске что-то вроде:

rxSummary(~. , data=file1) 

Затем данные извлекаются из озера данных. Тем не менее, он всегда читается и обрабатывается как файл с разделителями. Я хочу:

  1. Загрузите файл и храните его локально с кодом R (желательно нет).
  2. Используйте какой-то readLines эквивалент для получения данных, но прочитайте его в «raw», чтобы я мог выполнять свои проверки качества данных.

Эта функциональность существует еще? Если да, то как это делается?

EDIT: Я также попытался:

returnDataFrame = FALSE 

внутри RxTextData. Это возвращает список. Но, как я уже сказал, данные не считываются сразу из озера данных, пока я не запустил что-то вроде rxSummary, которое затем пытается прочитать его как обычный файл.

Контекст: У меня есть «плохой» CSV-файл, содержащий строки в двойных кавычках. Это приводит к разрыву RxTextData. Однако мой скрипт обнаруживает эти ошибки и исправляет их соответственно. Поэтому я не хочу, чтобы RevoScaleR читал данные и пытался интерпретировать разделители.

+0

У меня такая же проблема. Кажется нереальным, что Azure не может сделать что-то такое простое. Если вы можете импортировать только CSV-файлы, они должны перестать хвастаться тем, как Azure запускает R! –

ответ

1

Я нашел способ сделать это с помощью вызова API Azure Data Lake магазин REST (адаптировано из демо из httr пакета Hadley Уикхем на GitHub):

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. 
1

Вы можете сделать это с функциями SCALER как так. Установите разделитель символом, который не встречается в данных, и игнорируйте имена столбцов. Это создаст фрейм данных, содержащий один столбец символов, который вы можете манипулировать по мере необходимости.

# assuming that ASCII 0xff/255 won't occur 
src <- RxTextData("file", fileSystem="hdfs", delimiter="\x255", firstRowIsColNames=FALSE) 

dat <- rxDataStep(src) 

Хотя, учитывая, что Azure озеро данных действительно предназначена для хранения больших массивов данных, и это, кажется, достаточно мал, чтобы поместиться в памяти, я удивляюсь, почему вы не можете просто скопировать его на локальный диск .. ..

+0

Я не уверен, какие данные вы имеете в виду. Но я попробую этот метод, спасибо. –

+0

Я получаю сообщение об ошибке «Ошибка: чтение текстового файла: строка имеет больше столбцов» даже для небольших и чистых текстовых файлов. –

+0

Действительно ли это файл _text_, в котором вы читаете? –