2017-08-31 30 views
0

我在AWS s3中有一個分隔的.txt文件。 datan用þ839729þ25þ[email protected]þfirstnameþlastnameþ0þBLACKþ28/08/2017þ12329038þ99þ287þ81þ0如何在pyspark中導入'þ'分隔的.txt文件

我試着用databricks and sparkcontext來導入數據。雖然databricks方法運行並沒有拋出錯誤,但數據框中沒有數據。火花背景只是把錯誤說 - Cannot run multiple SparkContexts at once.

下面是2個appraoches,我試圖代碼:

from pyspark import SparkContext, SparkConf 
from pyspark.sql import SparkSession 
from pyspark.sql.functions import * 

path = "s3:/XXX.txt" 
df = sqlContext.read.format("com.databricks.spark.csv").option("header","true").option("sep","þ").load(path).distinct().cache() 

第二個方法

from pyspark import SparkConf, SparkContext 
from pyspark.sql import SQLContext 

conf = SparkConf().setMaster("local").setAppName("test") 
sc = SparkContext(conf = conf) 

path = "s3://XXX.txt" 
input = sc.textFile(path).map(lambda x: x.split('þ')) 

對於第一種方法,而沒有數據,它正在讀取原始數據中的第一行作爲標題,因爲對於df.show(10, False),我得到以下輸出:

|��839729�%25�%[email protected]�%Zulekha�%Ali�%0�%Blue�%28/08/2017�%329559038�%12�%128932287�%3081�%0| 

我完全是新的Spark和擴展PySpark,所以請在我身上輕鬆:)謝謝。

+0

你嘗試使用十六進制代碼這個角色?並且你不能使用2個上下文...使用getOrCreate函數來修復該問題 –

+0

另外,你是否只看到數據中的編碼問題?你確定這是實際的分隔符?如果一切都失敗了,找出分隔符的原始字節實際上是什麼 –

+0

該數據也存在於SQL服務器中,並且用於分割數據的分隔符是相同的。我如何使用您提到的十六進制代碼。我是新的python和火花?謝謝。 – Yuvaraj

回答

0

正確optiondelimiter沒有sep

... 
    .option("delimiter", "þ") 
+0

結果與'sep'或'delimiter'沒有區別。兩種情況下的輸出都是相同的。我在上面的問題中包含了輸出 – Yuvaraj

+0

使用'delimeter'選項和unicode'\ u'編碼Scala的字符,'\ x'爲pyspark – MaFF

1

您應該使用選項delimeter和六角逃避特殊字符:

df = sqlContext.read.format("com.databricks.spark.csv").option("header","true").option("delimeter","\xc3\xbe").load(path).distinct().cache()