**问题1:**直接读mongo写入hdfs,可能会发现少了几列。一般这些列空值特别多。pyspark读取mongo的schema是自动推断的,随机筛选1000行推断schema,如果这一千行都没有某列,那么这列就缺失了。
**问题2:**mongo里的数据可能有点脏,某列A可能既有long int格式,又有string格式。如果pyspark自动推断schema,可能识别成string格式,然后它遇到了少量的long int格式,就报错了,说string格式无法转换为long int。
解决办法是,自己定义schema,而不是自动推断。
以下是chatgbt写出的代码
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StructField, StringType, IntegerType
# 创建SparkSession
spark = SparkSession.builder.appName("Read from MongoDB").getOrCreate()
# 定义部分列的模式
schema = StructType([
StructField("name", StringType(), nullable=False),
StructField("age", IntegerType(), nullable=True)
])
# 读取MongoDB中的数据并应用模式
df = spark.read.format("mongo") \
.option("spark.mongodb.input.uri", "mongodb://localhost/db.collection") \
.schema(schema) \
.load()
# 显示DataFrame数据
df.show()
chat解释只定义了"name"和"age"两个列的模式,而其他列将被视为字符串类型。
然而实际操作,发现定义了2列的模式,那么结果就只有2列。可能跟spark或mongo版本有关系