PySpark-目录在DF中列为列

时间:2018-09-23 15:07:45

标签: apache-spark dataframe pyspark apache-spark-sql pyspark-sql

在HDFS上,我的目录是这样的

hdfs://主机名/ data / feed / data / dt = 20180909 / hour = 04 / uk / customer1'

在我的脚本中,我从文件中提取了所有信息,但是我还需要捕获输出数据框中的位置。此文件存储的唯一位置是在目录路径中(例如,上面= uk)

有没有办法将其提取出来以在新列中构成df输出的一部分?

ALSO,

我的Pyspark代码中包含以下语句。

问题是,当我喜欢(“%i ...)时,它认为它正在寻找整数变量-%g也存在相同的问题

我试图用\来转义字符,但这是行不通的。

如果我将所有单词更改为以'b'开头,则该问题不存在。因此,这取决于这个问题。

有人知道我如何摆脱这个问题吗?

    .withColumn('cleanapn',\
    sqlfunc.when(df4.apnstr.like("%info%"), "Info")\
    .when(df4.apnstr.like("%books%"), "Books")\
    .when(df4.apnstr.like("%interest%"), "Interest")\
    .when(df4.apnstr.like("%gonefishing%"), "Gonefishing")\
    .otherwise("Other"))\

谢谢!

1 个答案:

答案 0 :(得分:0)

使用wholeTextFiles api可以轻松解决问题的第一部分,该api提供了元组(文件名,文件内容),可用于提取位置信息。

例如:

rdd1 = sc.wholeTextFiles("/data/feed/data/dt=20180909/hour=04/uk/customer1/") 

将为您提供rdd1--

("/data/feed/data/dt=20180909/hour=04/uk/customer1/file1.txt","<data-in-file1.txt>")
("/data/feed/data/dt=20180909/hour=04/uk/customer1/file2.txt","<data-in-file2.txt>")

您可以操作此操作以获取DataFrame[location: string, data: string]的数据帧--

df = rdd1 \
       .map(lambda x : (x[0].split("/")[-2],x[1]))\
       .toDF(['location','data'])

理想情况下,

('uk',"<data-in-file1.txt>")
('uk',""<data-in-file2.txt>")

关于第二个问题,我认为使用%i或%g不会有任何问题,您必须包含要获取的特定错误。