Spark DataFrame Schema Nullable Поля
Я написал следующий код как в scala , так и в python, однако возвращаемый фрейм данных, похоже, не применяет непустые поля в моей схеме, которую я применяю. italianVotes.csv - это csv-файл с разделителем ' ~ ' и четырьмя полями. Я использую СПАРК 2.1.0.
Итальянвоты.csv
2657~135~2~2013-11-22 00:00:00.0
2658~142~2~2013-11-22 00:00:00.0
2659~142~1~2013-11-22 00:00:00.0
2660~140~2~2013-11-22 00:00:00.0
2661~140~1~2013-11-22 00:00:00.0
2662~1354~2~2013-11-22 00:00:00.0
2663~1356~2~2013-11-22 00:00:00.0
2664~1353~2~2013-11-22 00:00:00.0
2665~1351~2~2013-11-22 00:00:00.0
2667~1357~2~2013-11-22 00:00:00.0
Scala
import org.apache.spark.sql.types._
val schema = StructType(
StructField("id", IntegerType, false) ::
StructField("postId", IntegerType, false) ::
StructField("voteType", IntegerType, true) ::
StructField("time", TimestampType, true) :: Nil)
val fileName = "italianVotes.csv"
val italianDF = spark.read.schema(schema).option("sep", "~").csv(fileName)
italianDF.printSchema()
// output
root
|-- id: integer (nullable = true)
|-- postId: integer (nullable = true)
|-- voteType: integer (nullable = true)
|-- time: timestamp (nullable = true)
Python
from pyspark.sql.types import *
schema = StructType([
StructField("id", IntegerType(), False),
StructField("postId", IntegerType(), False),
StructField("voteType", IntegerType(), True),
StructField("time", TimestampType(), True),
])
file_name = "italianVotes.csv"
italian_df = spark.read.csv(file_name, schema = schema, sep = "~")
# print schema
italian_df.printSchema()
# output
root
|-- id: integer (nullable = true)
|-- postId: integer (nullable = true)
|-- voteType: integer (nullable = true)
|-- time: timestamp (nullable = true)
Мой главный вопрос заключается в том, почему первые два поля являются nullable, когда я установил их в не-nullable в моей схеме?
1 ответ:
В общем случае Spark
Вы можете спорить, является ли это хорошим подходом или нет, но в конечном счете это разумно. Если семантика источника данных не поддерживает ограничения nullability, то применение схемы также не может. В конце концов, всегда лучше предположить, что вещи могут бытьDatasetsлибо наследует свойствоnullableот своих родителей, либо делает вывод на основе внешних типов данных.null, чем потерпеть неудачу во время выполнения, если это противоположное предположение оказывается неверным.