Динамическое добавление заполняющих нулей

#apache-spark #pyspark #apache-spark-sql

#apache-spark #pyspark #apache-spark-sql

Вопрос:

 mock_data = [('TYCO', ' 1303','13'),('EMC', '  120989  ','123'), ('VOLVO  ', '102329  ','1234'),('BMW', '1301571345  ',' '),('FORD', '004','21212')]

df = spark.createDataFrame(mock_data, ['col1', 'col2','col3'])

 ------- ------------ ----- 

|   col1 |        col2| col3|
 
 ------- ------------ ----- 

|   TYCO|        1303|   13|

|    EMC|    120989  |  123|

|VOLVO  |    102329  | 1234|

|    BMW|1301571345  |     |

|   FORD|         004|21212|

 ------- ------------ ----- 
 
  

обрезать col2 и на основе длины (10-col2 длина) необходимо динамически добавлять нули заполнения в col3. объедините col2 и col3.

 df2 = df.withColumn('length_col2', 10-length(trim(df.col2)))
 ------- ------------ ----- ----------- 

|   col1|        col2| col3|length_col2|

 ------- ------------ ----- ----------- 

|   TYCO|        1303|   13|          6|

|    EMC|    120989  |  123|          4|

|VOLVO  |    102329  | 1234|          4|

|    BMW|1301571345  |     |          0|

|   FORD|         004|21212|          7|

 ------- ------------ ----- ----------- 
  

ожидаемый результат

  ------- ---------- ----- -------------

|   col1|      col2   | col3|output

 ------- ---------- ----- -------------

|   TYCO|      1303   |   13|1303000013

|    EMC|  120989     |  123|1209890123

|VOLVO  |  102329     | 1234|1023291234

|    BMW|  1301571345 |     |1301571345

|   FORD|       004   |21212|0040021212

 ------- ---------- ----- -------------
  

Ответ №1:

То, что вы ищете, — это rpad функция в pyspark.sql.functions , как указано здесь => https://spark.apache.org/docs/2.3.0/api/sql/index.html

Смотрите решение ниже :

 %pyspark

mock_data = [('TYCO', ' 1303','13'),('EMC', '  120989  ','123'), ('VOLVO  ', '102329  ','1234'),('BMW', '1301571345  ',' '),('FORD', '004','21212')]

df = spark.createDataFrame(mock_data, ['col1', 'col2','col3'])

df.createOrReplaceTempView("input_df")

spark.sql("SELECT *, concat(rpad(trim(col2),10,'0') , col3) as OUTPUT from input_df").show(20,False)

  

и результат

  ------- ------------ ----- --------------- 
|col1   |col2        |col3 |OUTPUT         |
 ------- ------------ ----- --------------- 
|TYCO   | 1303       |13   |130300000013   |
|EMC    |  120989    |123  |1209890000123  |
|VOLVO  |102329      |1234 |10232900001234 |
|BMW    |1301571345  |     |1301571345     |
|FORD   |004         |21212|004000000021212|
 ------- ------------ ----- --------------- 
  

Комментарии:

1. необходимо добавить col3 на основе столбца length_col2, затем необходимо объединить с col2