当前位置: 首页 > 知识库问答 >
问题:

当列包含彼此对齐的数组时,如何在Spark Scala数据框中爆炸数组的多列?

包翔
2023-03-14

我在制定这个问题时遇到了一点麻烦,但我会尽力解释。我了解如何分解数组的单个列,但我有多个数组列,其中数组在索引值方面彼此对齐。在我的数据帧中,分解每列基本上只是执行无用的交叉联接,从而导致数十个无效行。因此,我将从展示数据开始。

这显示了 SparkNLP 的一些结果,其中包含一些文本和文本的四组功能。从 tr 到 nr 的每一列都包含一个数组。这些数组中的每一个都与其他数组对齐。

+--+---------------------+---------------------+----------------------+--------------------+--------------------+
|ID|                 text|                   tr|                    lr|                  pr|                  nr|
+--+---------------------+---------------------+----------------------+--------------------+--------------------+
|10|  thing: MacKay rolls|[thing, :, MacKay,...|[thing, :, MacKay, ...|   [NN, :, NNP, NNS]|    [O, O, I-PER, O]|
|11|thing: MacKay roll...|[thing, :, MacKay,...|[thing, :, MacKay, ...|[NN, :, NNP, NNS,...|[O, O, I-PER, O, ...|
|12| * I would like to...| [*, I, would, lik...|  [*, I, would, lik...|[NN, PRP, MD, VB,...|[O, O, O, O, O, O...|
+--+---------------------+---------------------+----------------------+--------------------+--------------------+

我想要的是一个新的数据帧,其中包含ID和文本以及所有数组中每个ith项,位于一行上,如下所示的上述数据帧:

+--+---------------------+---------------------+----------------------+--------------------+--------------------+------+-------+---+-----+
|ID|                 text|                   tr|                    lr|                  pr|                  nr| token|  lemma|pos|  ner|
+--+---------------------+---------------------+----------------------+--------------------+--------------------+------+-------+---+-----+
|10|  thing: MacKay rolls|[thing, :, MacKay,...|[thing, :, MacKay, ...|   [NN, :, NNP, NNS]|    [O, O, I-PER, O]| thing|  thing| NN|    O|
|10|  thing: MacKay rolls|[thing, :, MacKay,...|[thing, :, MacKay, ...|   [NN, :, NNP, NNS]|    [O, O, I-PER, O]|     :|      :|  :|    O|
|10|  thing: MacKay rolls|[thing, :, MacKay,...|[thing, :, MacKay, ...|   [NN, :, NNP, NNS]|    [O, O, I-PER, O]|MacKay| MacKay|NNP|I-PER|
|10|  thing: MacKay rolls|[thing, :, MacKay,...|[thing, :, MacKay, ...|   [NN, :, NNP, NNS]|    [O, O, I-PER, O]| rolls|   roll|NNS|    O|
|11|thing: MacKay roll...|[thing, :, MacKay,...|[thing, :, MacKay, ...|[NN, :, NNP, NNS,...|[O, O, I-PER, O, ...| thing|  thing| NN|    O|
|11|thing: MacKay roll...|[thing, :, MacKay,...|[thing, :, MacKay, ...|[NN, :, NNP, NNS,...|[O, O, I-PER, O, ...|     :|      :|  :|    O|
|11|thing: MacKay roll...|[thing, :, MacKay,...|[thing, :, MacKay, ...|[NN, :, NNP, NNS,...|[O, O, I-PER, O, ...|MacKay| MacKay|NNP|I-PER|
|11|thing: MacKay roll...|[thing, :, MacKay,...|[thing, :, MacKay, ...|[NN, :, NNP, NNS,...|[O, O, I-PER, O, ...|  roll|   roll|NNS|    O|
|11|...
...
|12| * I would like to...| [*, I, would, lik...|  [*, I, would, lik...|[NN, PRP, MD, VB,...|[O, O, O, O, O, O...|     *|      *| NN|    O|
|12| * I would like to...| [*, I, would, lik...|  [*, I, would, lik...|[NN, PRP, MD, VB,...|[O, O, O, O, O, O...|     I|      I|PRP|    O|
|12| * I would like to...| [*, I, would, lik...|  [*, I, would, lik...|[NN, PRP, MD, VB,...|[O, O, O, O, O, O...| would|  would| MD|    O|
|12| * I would like to...| [*, I, would, lik...|  [*, I, would, lik...|[NN, PRP, MD, VB,...|[O, O, O, O, O, O...|  like|   like| VB|    O|
|12| * I would like to...| [*, I, would, lik...|  [*, I, would, lik...|[NN, PRP, MD, VB,...|[O, O, O, O, O, O...|    to|    ...|...|    O|
|12|...
...
+--+---------------------+---------------------+----------------------+--------------------+--------------------+------+-------+---+-----+

我不需要输出中的tr到nr列,但为了清晰起见保留了它们。

有没有办法做到这一点?

此外,是否还有一种方法可以同时提取数组索引(添加到输出行)?

共有1个答案

姜俊友
2023-03-14

在这种情况下,您希望使用withColumn表达式分解各个列。假设您将数据集加载为初始数据框df。现在,您希望实现以下目标。

      val df = <load initial dataset>
      val df1  = df.select($"id", $"text",$"tr", $"lr", $"pr", $"nr").withColumn("tr", explode($"tr")).withColumn("lr",explode($"lr")).withColumn("pr",explode($"pr")).withColumn("nr",explode($"nr"))

这将导致将数组值添加到记录中,并用 ID 标记

 类似资料:
  • 问题内容: 我有一个包含JSON对象的表。每个JSON对象在方括号中均包含一个数组,并用逗号分隔。 如何使用SQL访问方括号数组中的任何元素,例如“ Matt”? 我在Hadoop上使用“ Hive”。如果您知道如何在SQL中执行此操作,那很好:) 问题答案: 您可以在Hive中执行以下操作: 首先,您需要一个JSON SerDe(Serializer / Deserializer)。我见过的最实

  • 问题内容: 我有一个表名消息。我需要获取一个列名,其中 receiver_id = 4, 但我总是得到空输出。 屏幕截图上方有3行。第二行和第三行与其他ID一起存在,我需要对其进行分解并显示第二行和第三行记录。 如何编写MySQL查询? 问题答案: 存储逗号分隔值确实是一个糟糕的设计,您应该 首先将接收方的所有关联存储在联结表中,如果您无法更改架构,则可以针对当前情况在逗号分隔列表中搜索值

  • 给定一个spark 2.3数据帧,其中一列包含JSON数组,如何将其转换为JSON字符串的spark数组?或者,等效地,我如何分解JSON,以便输入: 我得到: 非常感谢! p、 数组中条目的形状是可变的。 下面是一个示例输入,如果它是有用的: p. p. s.这不同于迄今为止所有建议的重复问题。例如,如何使用火花数据帧查询JSON数据列?的问题和解决方案适用于(1)数据是所有JSON数据,因此整

  • 熊猫:当单元格内容为列表时,为列表中的每个元素创建一行 很好的问题和答案,但只处理一列和列表(在我的答案中,自定义函数将适用于多列,而且接受的答案是使用最耗时的,这是不建议的,检查更多信息,我什么时候应该在我的代码中使用pandas apply()?)

  • 问题内容: 我需要一些有关将包含多维数组的JSON对象转换为类的帮助。我试图反序列化json对象,但失败了。JsonMaclar类对象为null。请帮忙。 脚本代码; C#代码; 问题答案: 我建议您使用JSON.NET。它是一个开放源代码库,用于将c#对象序列化和反序列化为json,将Json对象序列化为.net对象… 序列化示例: Json.NET 4.5版本8 –多维数组支持,Unicode

  • 问题内容: 我有以下数据框: 我想选择列“ a”,然后仅选择一个特定元素(即,首先:1.,2.,3)。 我需要添加什么: ? 问题答案: 选择带有标签的行。 选择作为和的instersection的单元格 选择 所有 行和名为的列。请注意,尽管这可行,但这并不是引用数据框的列的惯用方式。为此,您应该使用 现在,您在列的单元格中有了列表,因此可以使用向量化的字符串方法来访问这些列表的元素,如下所示。