2017-02-14 43 views
1

使用R Server時,我想簡單地從Azure Data Lake中讀取原始文本(如baseLine)。我可以連接並獲取數據,像這樣:readline等效於將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'中讀取數據,以便我可以執行自己的數據質量檢查。

此功能是否存在?如果是這樣,這是如何完成的?

編輯:我也曾嘗試:

returnDataFrame = FALSE 

RxTextData。這將返回一個列表。但正如我所說的,數據不會立即從數據庫中讀取,直到我運行諸如rxSummary之類的東西,然後嘗試將其作爲常規文件讀取。

上下文:我有一個「壞」的CSV文件,其中包含雙引號內的換行符。這會導致RxTextData中斷。但是,我的腳本檢測到這些事件並相應地修復它們。因此,我不希望RevoScaleR讀取數據並嘗試解釋分隔符。

+0

我有同樣的問題。 Azure無法做到這一點很簡單,這似乎是不真實的。如果你只能導入CSV文件,他們應該停止吹噓Azure如何運行R! –

回答

1

我發現通過調用Azure的數據湖店REST API(改編自演示從哈德利韋翰的httr包在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

你可以用潔牙機的功能,如做所以。將分隔符設置爲不在數據中出現的字符,並忽略列名稱。這將創建一個包含單個字符列的數據框,您可以根據需要對其進行操作。

# 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_文件嗎? –