非结构化文件的Spark提取和转换

时间:2017-02-28 05:56:15

标签: hadoop apache-spark

我的本​​地目录中有一个包含许多销售文本文件的文件夹。我们来看两个文本文件的例子:

文本文件1:

Sales Details
20161120


Sales Person: John

Code    Product     Quantity    Price
A0001   Product1    20          15.90
A0003   Product3    13          23.80

文本文件2:

Sales Details
20161130


Sales Person: Alicia

Code    Product     Quantity    Price
A0007   Product7    342         79.50
A0008   Product8    55          432.80
A0009   Product9    100         134.30

我曾使用Flume将文件流式传输到HDFS。所有这些小文件都组合成HDFS中的一个大文件。当我使用Spark执行这些文件的提取和转换时,我遇到了一些需要在这里寻求所有人建议的问题。

基于上述2个文件,它将合并为HDFS中的一个文件。我使用Spark从HDFS读取文本文件,如下所示:

lines = spark.read.text('/user/tester/sales')

如何将拆分为两个销售明细,然后为每个销售人员提取信息?我的最终目标是提取信息并将其放入Hive表中,并使用以下结构:

Date     SalesPerson     Code     Product     Quantity    Price

感谢。

1 个答案:

答案 0 :(得分:0)

您的文件结构不是很方便处理,但您始终可以使用带有spark wholeTextFiles的正则表达式将它们重写为表格格式。请参阅此pyspark代码作为示例:

import re

def extract_sales(file):
    for line in file[1].split("\n"):
        if re.match('\d{8}', line.strip()):
            date = line.strip()
        if re.search('^Sales Person', line):
            person = re.match("^Sales Person: (.*)", line).group(1)
        if re.search('^A00', line):
            yield [date, person] + re.split('\s+', line)

raw_data = spark.sparkContext.wholeTextFiles('sales/')
raw_data.flatMap(extract_sales) \
    .toDF(['Date', 'SalesPerson', 'Code', 'Product', 'Quantity', 'Price']).show()

+--------+-----------+-----+--------+--------+------+
|    Date|SalesPerson| Code| Product|Quantity| Price|
+--------+-----------+-----+--------+--------+------+
|20161120|       John|A0001|Product1|      20| 15.90|
|20161120|       John|A0003|Product3|      13| 23.80|
|20161130|     Alicia|A0007|Product7|     342| 79.50|
|20161130|     Alicia|A0008|Product8|      55|432.80|
|20161130|     Alicia|A0009|Product9|     100|134.30|
+--------+-----------+-----+--------+--------+------+