Нужно преобразовать String Column в Integer Column в PySpark. Что происходит со строками, которые не могут быть преобразованы? - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь преобразовать столбец в кадре данных в IntegerType. Вот пример кадра данных:

+----+-------+
|From|     To|
+----+-------+
|   1|1664968|
|   2|      3|
|   2| 747213|
|   2|1664968|
|   2|1691047|
|   2|4095634|
+----+-------+

Я использую следующий код:

exploded_df = exploded_df.withColumn('From', exploded_df['To'].cast(IntegerType()))

Однако я хотел знать, что происходит со строками, которые не являются цифрами, например, что произойдет, если у меня будет строка с несколькими пробелами? Причина в том, что я хочу отфильтровать кадр данных, чтобы получить значения столбца «От», у которых нет номеров в столбце «Кому».

Существует ли более простой способ фильтрации по этому условию без преобразования столбцов в IntegerType?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 05 апреля 2020

Значения, которые не могут быть приведены, установлены на null, и столбец будет считаться столбцом nullable этого типа. Вот простой пример:

from pyspark import SQLContext
from pyspark.sql import SparkSession
import pyspark.sql.functions as F
from pyspark.sql.types import IntegerType

spark = SparkSession.builder.getOrCreate()

sql_context = SQLContext(spark.sparkContext)

df = sql_context.createDataFrame([("1",),
                                  ("2",),
                                  ("3",),
                                  ("4",),
                                  ("hello world",)], schema=['id'])

print(df.show())

df = df.withColumn("id", F.col("id").astype(IntegerType()))

print(df.show())

Вывод:

+-----------+
|         id|
+-----------+
|          1|
|          2|
|          3|
|          4|
|hello world|
+-----------+

+----+
|  id|
+----+
|   1|
|   2|
|   3|
|   4|
|null|
+----+

И для проверки правильности схемы:

print(df.printSchema())

Вывод:

None
root
 |-- id: integer (nullable = true)

Надеюсь, это поможет!

0 голосов
/ 05 апреля 2020

Мы можем использовать regex , чтобы проверить, есть ли в столбце To данные alphabets,spaces, используя функцию .rlike в искре для фильтрации соответствующих строк.

Example:

df=spark.createDataFrame([("1","1664968"),("2","3"),("2","742a7"),("2"," "),("2","a")],["From","To"])

df.show()
#+----+-------+
#|From|     To|
#+----+-------+
#|   1|1664968|
#|   2|      3|
#|   2|  742a7|
#|   2|       |
#|   2|      a|
#+----+-------+

#get the rows which have space or word in them
df.filter(col("To").rlike('([a-z]|\\s+)')).show(truncate=False)
#+----+-----+
#|From|To   |
#+----+-----+
#|2   |742a7|
#|2   |     |
#|2   |a    |
#+----+-----+

#to get rows which doesn't have any space or word in them.
df.filter(~col("To").rlike('([a-z]|\\s+)')).show(truncate=False)
#+----+-------+
#|From|To     |
#+----+-------+
#|1   |1664968|
#|2   |3      |
#+----+-------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...