我正在嘗試加載一個單行文件,整個文件中沒有新的行包,因此技術(shù)單行大小是文件的大小。我嘗試使用下面的代碼來加載數(shù)據(jù)。val data= spark.sparkContext.textFile("location") data.count 它無法返回任何值。嘗試使用以下代碼將文件作為字符串讀取,嘗試用 java 代碼編寫。import org.apache.hadoop.conf.Configurationimport org.apache.hadoop.fs.Pathimport org.apache.hadoop.fs.FileSystemval inputPath = new Path("File")val conf = spark.sparkContext.hadoopConfigurationval fs = FileSystem.get(conf) val inputStream = fs.open(inputPath)import java.io.{BufferedReader, InputStreamReader}val readLines = new BufferedReader(new InputStreamReader(inputStream)).readLine()JVM 正在退出并出現(xiàn)以下錯誤。ava HotSpot(TM) 64 位服務(wù)器虛擬機警告:INFO: os::commit_memory(0x00007fcb6ba00000, 2148532224, 0) 失?。籩rror='無法分配內(nèi)存' (errno=12)Java 運行時環(huán)境沒有足夠的內(nèi)存來繼續(xù)。本機內(nèi)存分配 (mmap) 未能映射 2148532224 字節(jié)以提交保留內(nèi)存。問題是整個數(shù)據(jù)都在單行中,使用 \n 來識別新記錄(新行)。因為有 \n 它試圖加載到產(chǎn)生內(nèi)存問題的單行中我可以根據(jù)長度拆分那個長字符串,為每 200 個字符(0,200)的第一行添加換行符。(200,400) 是第二行。樣本輸入This is Achyuth This is ychyath This is Mansoor ... .... this line size is more than 4 gigs.輸出This is AchyuthThis is ychyathThis is Mansoor. . .
2 回答

一只斗牛犬
TA貢獻1784條經(jīng)驗 獲得超2個贊
如果文件大小是拆分大小的倍數(shù)并且字符編碼是固定長度的(ASCII、UTF-16、UTF-32、UTF-8 中沒有高于 127 的代碼點或類似...),則此方法有效。
給定文件
This is AchyuthThis is ychyathThis is Mansoor
val rdd = spark
.sparkContext
.binaryRecords(path, 15)
.map(bytes => new String(bytes))
val df = spark.createDataset(rdd)
df.show()
輸出:
+---------------+
| value|
+---------------+
|This is Achyuth|
|This is ychyath|
|This is Mansoor|
+---------------+

智慧大石
TA貢獻1946條經(jīng)驗 獲得超3個贊
Spark 沒有為文本文件設(shè)置 EOL 分隔符的選項。
對我來說處理這個問題的最好方法是在 spark 中使用 Setting textinputformat.record.delimiter你會得到很多選擇。
添加回答
舉報
0/150
提交
取消