【发布时间】:2022-01-19 15:31:19
【问题描述】:
我正在尝试根据 100 列 (sch0,shm2...shm100) 中的值创建大约 9-10 列,但是这些列的值将是列中的值 (idm0,idm1....idm100 ) 这是同一数据框的一部分。
除了这 2 对 100 之外,还有其他列。 问题是,并不是所有的方案(schm0,schm1..schm100)都会有值,我们必须遍历每一个来找出值并相应地创建列,85+列大部分时间都是空的,所以我们需要忽略它们。
输入数据框示例:
+----+----+----+----+-----+-----+-----+-----+-----+-----+-----+
|col1|col2|col3|sch0|idsm0|schm1|idsm1|schm2|idsm2|schm3|idsm3|
+----+----+----+----+-----+-----+-----+-----+-----+-----+-----+
| a| b| c| 0| 1| 2| 3| 4| 5| null| null|
+----+----+----+----+-----+-----+-----+-----+-----+-----+-----+
schm 和idsm 可以达到 100,所以它基本上是 100 列的键值对。
预期输出:
----+----+----+----------+-------+-------+
|col1|col2|col3|found_zero|found_2|found_4|
+----+----+----+----------+-------+-------+
| a| b| c| 1| 3| 5|
+----+----+----+----------+-------+-------+
注意:任何列都没有固定值,任何列都可以有任何值,并且我们创建的列必须基于在任何方案列中找到的值 (schm0...schm100)并且创建的列中的值将是方案的对应值,即 idsymbol (idsm0...idsm100)
我发现很难制定一个计划来做这件事,任何帮助将不胜感激。
编辑- 添加另一个输入示例--
col1|col2|schm_0|idsm_0|schm_1|idsm_1|schm_2|idsm_2|schm_3|idsm_3|schm_4|idsm_4|schm_5|idsm_5|
+----+----+------+------+------+------+------+------+------+------+------+------+------+------+
| 2| 6| b1| id1| i| id2| xs| id3| ch| id4| null| null| null| null|
| 3| 5| b2| id5| x2| id6| ch| id7| be| id8| null| null| db| id15|
| 4| 7| b1| id9| ch| id10| xs| id11| us| id12| null| null| null| null|
+----+----+------+------+------+------+------+------+------+------+------+------+------+------+
对于一个特定的记录,col(schm_0,schm_1....schm_100) 可以有大约 9 到 10 个唯一值,因为并非所有列都会填充值。
我们需要根据 9 个唯一值创建 9 个不同的列,因此对于一行,我们需要遍历 100 个 schmeme 列中的每一个,并根据找到的值收集在那里找到的所有值,分开需要创建列...并且这些创建的列中的值将是 idsm(idsm_0,idsm_1....idsm_100) 中的值
即如果 schm_0 具有值“cb”,我们需要为例如“col_cb”创建新列,并且此列中的值“col_cb”将是“idsm_0”列中的值。 同样,我们需要对所有 100 列执行此操作(我们需要省略空列)。
预期输出-
+----+----+------+------+-----+------+------+------+------+------+------+
|col1|col2|col_b1|col_b2|col_i|col_x2|col_ch|col_xs|col_be|col_us|col_db|
+----+----+------+------+-----+------+------+------+------+------+------+
| 2| 6| id1| null| id2| null| id4| id3| null| null| null|
| 3| 5| null| id5| null| id6| 1d7| null| id8| null| id15|
| 4| 7| id9| null| null| null| 1d10| id11| null| id12| null|
+----+----+------+------+-----+------+------+------+------+------+------+
希望这可以清除问题陈述。 对此的任何帮助将不胜感激。
小问题再次编辑-
正如我们在上面的示例中看到的,我们创建的列是基于在方案符号列中找到的值,并且已经定义了一组将被创建的列,其数量为 10..列例如将是(col_a,col_b,col_c,cold_d,col_e,col_f,col_g_col_h,col_i,col_j)
并非所有 10 个关键字,即 (a,b,c....j) 都会一直出现在 (shcheme0.....scheme99) 下的数据集中。
要求是我们需要传递所有 10 列,如果某些键 (a,b,c...j) 不存在,则创建的列将具有空值。
【问题讨论】:
-
您能否给出或扩展您的示例,将多条记录作为输入和您期望的输出?仅仅看到单个记录的输出和您的描述就会让人感到困惑。
-
@NikunjKakadiya ,很抱歉没有说清楚,我添加了更多示例..希望有所帮助。
-
查看我发布的答案..
-
@NikunjKakadiya 感谢您的快速响应,这似乎适用于较小的方案和 idsybmol 列集,但正如我所提到的,我在实际案例中每列都有数百个,因此将所有这 100 个列在堆栈中会是明智的吗?或者我们可以尝试像 Map 这样的东西,我们可以在其中创建 100 多个列并将 scheme 和 idsm 存储为键值对,然后对存储在 map 中的值进行条件列创建。
-
@Arjun_Jha 据我所知,您可以使用 map 使其与堆栈功能一起更加动态,但不知道没有堆栈。遍历所有列会增加参与度,但会检查我是否找到更有效的方法。
标签: dataframe scala apache-spark