Scala 如何从半结构化文本文件加载数据帧?

Scala 如何从半结构化文本文件加载数据帧?,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有一个半结构化的文本文件,我想把它转换成Spark中的数据帧。我脑子里确实有一个模式,如下所示。然而,我发现解析文本文件并分配模式很有挑战性 以下是我的示例文本文件: “服务好” 汤姆·马丁(美国)2015年10月17日 4. 长时间回顾。。 旅游情侣休闲类型 客舱飞行经济 迈阿密到芝加哥的路线 飞行日期:2015年9月 座椅舒适性12345 客舱员工服务12345 地面服务12345 物有所值12345 建议否 “不错” M Muller(加拿大)2015年9月22日 6. 又是一篇长篇评论

我有一个半结构化的文本文件,我想把它转换成Spark中的数据帧。我脑子里确实有一个模式,如下所示。然而,我发现解析文本文件并分配模式很有挑战性

以下是我的示例文本文件:

“服务好”
汤姆·马丁(美国)2015年10月17日
4.
长时间回顾。。
旅游情侣休闲类型
客舱飞行经济
迈阿密到芝加哥的路线
飞行日期:2015年9月
座椅舒适性12345
客舱员工服务12345
地面服务12345
物有所值12345
建议否
“不错”
M Muller(加拿大)2015年9月22日
6.
又是一篇长篇评论。。
TXT-101飞机
顾客夫妇休闲的类型
头等舱
去池路
飞行日期:2015年9月
座椅舒适性12345
客舱员工服务12345
食品和饮料12345
机上娱乐12345
地面服务12345
物有所值12345
推荐是
.
.
我期望得到的结果模式如下所示:

+----------------+------------+--------------+---------------------+---------------+---------------------------+----------+------------------+-------------+--------------+-------------------+----------------+--------------+---------------------+-----------------+------------------------+----------------+---------------------+-----------------+
|审查|页眉|用户名|用户|国家|用户|审查|日期|总分|审查|飞机|旅行者类型|客舱飞行|路线|来源|路线|目的地|日期飞行|座椅舒适|客舱员工服务|餐饮|机上娱乐|地面服务|无线和连接|物有所值|
+----------------+------------+--------------+---------------------+---------------+---------------------------+----------+------------------+-------------+--------------+-------------------+----------------+--------------+---------------------+-----------------+------------------------+----------------+---------------------+-----------------+
|“优质服务”|汤姆·马丁|美国| 2015年10月17日| 4 |长期回顾|情侣休闲|经济|迈阿密|芝加哥| 2015年9月| 12345 | 12345 | 12345 | 12345|
|“不错”| M Muller |加拿大| 2015年9月22日| 6 |又一次长时间回顾TXT-101 |情侣休闲|头等舱| IND | CHI | 2015年9月| 12345 | 12345 | 12345 | 12345 | 12345|
+----------------+------------+--------------+---------------------+---------------+---------------------------+----------+------------------+-------------+--------------+-------------------+----------------+--------------+---------------------+-----------------+------------------------+----------------+---------------------+-----------------+
您可能注意到,对于文本文件中的每个数据块,前四行映射到用户定义的列,如Review_Header、user_Name、user_Country、user_Review_Date,而其他各行都定义了列

在这种情况下,除了编写冗长的代码外,最好的方法是什么

更新:我想让这个问题变得更棘手一些。如果“长时间回顾…”和“另一个长时间回顾”本身可以跨越多个换行符呢。如何在每个区块的多行上解析评论

在这种情况下,使用模式推理技术而不是编写冗长的代码,最好的方法是什么

您没有太多选择,必须编写详细的代码或自定义代码(这将隐藏将此类文件加载到数据帧的复杂性)

用于加载文件并相应地对其进行转换

textFile(路径:String):数据集[String]加载文本文件并返回字符串数据集。有关更多详细信息,请参阅另一个重载的textFile()方法的文档


如果您保证半结构化文本文件包含由两个换行符分隔的记录,并且这两个换行符永远不会出现在“长时间审阅…”部分,则您可以使用带有修改分隔符(
“\n\n”
)的文本文件,然后处理这些行,而无需编写自定义文件格式

sc.hadoopConfiguration.set("textinputformat.record.delimiter", "\n\n")
df = sc.textFile("sample-file.txt")
然后,您可以在
“\n”
“\t”
上进一步拆分以创建字段和列

看到你的更新,这是一个困难的问题。你必须问问自己,哪些属性中的识别信息不在评论中。或保证以特定格式显示的内容。例如

  • 你能保证长评论中没有两条换行吗?如果我们在
    “\n\n”
    上拆分以生成块,这一点很重要
  • 你能保证长时间回顾中没有标签吗
  • 飞机、客舱飞行、客舱员工服务、飞行日期、食品饮料、地面服务等是否是完整的属性列表?你有可能的属性的完整列表吗
以及一些元问题:

  • 这些数据来自哪里
  • 我们可以用更好的格式申请吗
  • 我们能从更好的来源找到这些数据或我们正在寻找的方面吗
有了这些知识,你会对如何继续有更好的想法。例如,如果审阅文本中没有选项卡(或它们被转义为“\t”或其他内容):

  • 提取
    行[0]
    -第一行“良好服务”
  • 提取
    l