我的本地目录中有一个包含许多销售文本文件的文件夹。我们来看两个文本文件的例子:
文本文件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
感谢。
答案 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|
+--------+-----------+-----+--------+--------+------+