我有一个pyspark.pandas.frame.DataFrame。我需要将其写入 Hive_metastore 表,但无法这样做。我有一个如下所示的数据框:
df: (df.dtypes)
COL-a int32
Date object
COL-b float64
COL-c float64
dtype: object
from pyspark.sql.types import StructType, StructField,StringType, IntegerType, FloatType, DateType
my_schema = StructType(\[
StructField("COL-a", IntegerType(), True),
StructField("Date", DateType(), True),
StructField("COL-b", FloatType(), True),
StructField("COL-c", FloatType(), True),
\])
df_spark = spark.createDataFrame(df, schema= my_schema)
# Create a temporary view of the DataFrame
df_spark.createOrReplaceTempView("hello_hi")
# Write the DataFrame to a table in Hive metastore
spark.sql("CREATE OR REPLACE TABLE Hive_metastore.Random_loc_1.Final_res AS SELECT \* FROM hello_hi")
我收到以下错误:
PySparkTypeError: \[CANNOT_ACCEPT_OBJECT_IN_TYPE\]
结构类型can not accept object
COL-a in type str
。
为什么会发生这种情况以及如何解决?请帮忙。任何帮助将不胜感激
尝试了一切,但不知何故无法解决这个 my_schema 问题。没有 chatgpt 或 Databricks 助手可以帮助我。就连spark官方网页也没有很好的解释。
COL-a
在您的模式中定义为IntegerType()
,但错误表明它被视为字符串(str),似乎存在数据类型不一致。这可能是由于 pandas DataFrame df 转换为 PySpark DataFrame 的方式所致。
你能试试这个吗:
# Ensure correct data types in pandas DataFrame
df['COL-a'] = df['COL-a'].astype('int32')
df['Date'] = pd.to_datetime(df['Date']) # Assuming 'Date' is in a format pandas can parse
df['COL-b'] = df['COL-b'].astype('float64')
df['COL-c'] = df['COL-c'].astype('float64')
# Let Spark infer the schema
df_spark = spark.createDataFrame(df)
df_spark.createOrReplaceTempView("hello_hi")
spark.sql("CREATE OR REPLACE TABLE Hive_metastore.Random_loc_1.Final_res AS SELECT * FROM hello_hi")