Regex 将所选行更改为列

Regex 将所选行更改为列,regex,scala,dataframe,apache-spark,pivot,Regex,Scala,Dataframe,Apache Spark,Pivot,我有一个如下结构的数据帧 +------+-------------+--------+ |region| key| val| +--------------------+--------+ |Sample|row1 | 6| |Sample|row1_category| Cat 1| |Sample|row1_Unit | Kg| |Sample|row2 | 4| |Sample|row2_

我有一个如下结构的数据帧

+------+-------------+--------+
|region|          key|     val|
+--------------------+--------+
|Sample|row1         |       6|
|Sample|row1_category|   Cat 1|
|Sample|row1_Unit    |      Kg|
|Sample|row2         |       4|
|Sample|row2_category|   Cat 2|
|Sample|row2_Unit    |     ltr|
+------+-------------+--------+
+------+-------------+--------+--------+--------+
|region|          key|     val|Category|   Unit |
+--------------------+--------+--------+--------+
|Sample|row1         |       6|   Cat 1|      Kg|
|Sample|row2         |       4|   Cat 2|     ltr|
+------+-------------+--------+--------+--------+
我试图添加一列并将值从一行推到另一列,但没有添加类别和单位列

我想把它转换成下面的结构

+------+-------------+--------+
|region|          key|     val|
+--------------------+--------+
|Sample|row1         |       6|
|Sample|row1_category|   Cat 1|
|Sample|row1_Unit    |      Kg|
|Sample|row2         |       4|
|Sample|row2_category|   Cat 2|
|Sample|row2_Unit    |     ltr|
+------+-------------+--------+
+------+-------------+--------+--------+--------+
|region|          key|     val|Category|   Unit |
+--------------------+--------+--------+--------+
|Sample|row1         |       6|   Cat 1|      Kg|
|Sample|row2         |       4|   Cat 2|     ltr|
+------+-------------+--------+--------+--------+

我需要对多个键执行此操作,我将有第2行、第3行等,您可以通过按键分组,并使用
收集列表
进行区域和聚合,使用ragex
^[^.]+
获得所有字符,直到
字符

更新:您可以使用
(\\d{1,})
regex从字符串(捕获组)中查找所有数字,例如,如果您有
行123\u 456\u单元
,并且您的函数看起来像
regexp\u extract(\\d{1,}),0)
如果将最后一个参数更改为1,您将获得
123
,然后您将获得
456
。希望能有帮助

输出:

root
 |-- region: string (nullable = true)
 |-- key: string (nullable = true)
 |-- val: string (nullable = true)

+------+-------------+-----+
|region|          key|  val|
+------+-------------+-----+
|Sample|         row1|    6|
|Sample|row1_category|Cat 1|
|Sample|    row1_Unit|   Kg|
|Sample|         row2|    4|
|Sample|row2_category|Cat 2|
|Sample|    row2_Unit|  ltr|
+------+-------------+-----+

+------+----+---+--------+----+
|region| key|val|Category|Unit|
+------+----+---+--------+----+
|Sample|row1|  6|   Cat 1|  Kg|
|Sample|row2|  4|   Cat 2| ltr|
+------+----+---+--------+----+

您可以通过按键分组,或者使用
collect\u list
进行区域和聚合,使用ragex
^[^\u]+
获得所有字符,直到
字符

更新:您可以使用
(\\d{1,})
regex从字符串(捕获组)中查找所有数字,例如,如果您有
行123\u 456\u单元
,并且您的函数看起来像
regexp\u extract(\\d{1,}),0)
如果将最后一个参数更改为1,您将获得
123
,然后您将获得
456
。希望能有帮助

输出:

root
 |-- region: string (nullable = true)
 |-- key: string (nullable = true)
 |-- val: string (nullable = true)

+------+-------------+-----+
|region|          key|  val|
+------+-------------+-----+
|Sample|         row1|    6|
|Sample|row1_category|Cat 1|
|Sample|    row1_Unit|   Kg|
|Sample|         row2|    4|
|Sample|row2_category|Cat 2|
|Sample|    row2_Unit|  ltr|
+------+-------------+-----+

+------+----+---+--------+----+
|region| key|val|Category|Unit|
+------+----+---+--------+----+
|Sample|row1|  6|   Cat 1|  Kg|
|Sample|row2|  4|   Cat 2| ltr|
+------+----+---+--------+----+


您可以提供更多行,还可以执行如何更正此值为“单位”或“类别”的操作。如上所述,我认为您的数据中有一个后缀_类别和_单位。你能确认一下吗。你是对的。我们需要使用后缀_cat和后缀_Unit进行过滤。您可以提供更多行,也可以执行如何更正此值为单位或类别。如上所述,我认为您的数据中有一个后缀_类别和_单位。你能确认一下吗。你是对的。我们需要使用suffix_cat和suffix_unitHi进行过滤。我想根据键列中存在的类别进行过滤,而不是基于,因为有时候键列可能有行_1_cat等等。所以regexp应该是类似“^[^ cat]+”或“^[^ uom]+”的东西,我的regex正确吗。?我不擅长正则表达式。提前谢谢你,嗨,安德泽斯。谢谢你的解决方案,但我想使用一个正则表达式来帮助我过滤掉没有cat和uom的行。只有当行名仅为row1而不是row|1时,您给出的一个就可以了。如果您想过滤掉这些行,只需使用以下命令:
df.filter('key.contains('u cat”)| | key.contains('u unit'))。show()
第一个正则表达式不能满足我的要求,因为有时键可以是row|1或row|1|2。您给出的正则表达式仅在键为row1Hi时有效。我希望根据键列中的类别进行筛选,而不是基于u,因为有时键列可能有row_1_cat等等。所以regexp应该是类似“^[^ cat]+”或“^[^ uom]+”的东西,我的regex正确吗。?我不擅长正则表达式。提前谢谢你,嗨,安德泽斯。谢谢你的解决方案,但我想使用一个正则表达式来帮助我过滤掉没有cat和uom的行。只有当行名仅为row1而不是row|1时,您给出的一个就可以了。如果您想过滤掉这些行,只需使用以下命令:
df.filter('key.contains('u cat”)| | key.contains('u unit'))。show()
第一个正则表达式不能满足我的要求,因为有时键可以是row|1或row|1|2。您提供的正则表达式只有在键为row1Hi-Nikk时才起作用。谢谢你的解决方案。但问题是我想我错过了一点。钥匙有时会有一排猫,一排猫。我总是希望根据键中字符串末尾的CAT和UOM获取类别和UOM。您能给出键的所有可能值吗。对于您的解决方案,您可以使用字符串运算符将最后一个“\u1”替换为任何特定的分隔符,该分隔符不会出现在您的键中,并且可以在上述df1声明中的“\u1”处使用。每个键组合都将有一个cat和uom。钥匙可以有多个,最后有一个cat或uomHi Nikk。谢谢你的解决方案。但问题是我想我错过了一点。钥匙有时会有一排猫,一排猫。我总是希望根据键中字符串末尾的CAT和UOM获取类别和UOM。您能给出键的所有可能值吗。对于您的解决方案,您可以使用字符串运算符将最后一个“\u1”替换为任何特定的分隔符,该分隔符不会出现在您的键中,并且可以在上述df1声明中的“\u1”处使用。每个键组合都将有一个cat和uom。这些键可以有多个,最后有一个cat或uom