我正在构建基于Apache Spark的推荐引擎。我可以从PostgreSQL加载数据,但是当我试图映射这些数据时,我得到一个值错误:PySpark值错误
这个工作成功。
df = sql_context.read.format('jdbc').options(
url=db_url,
dbtable=db_table, driver="org.postgresql.Driver"
).load()
此行将模式打印到控制台。
df.printSchema()
它输出“ınteger”而不是“整数”。我认为这是问题。
下面是模式的控制台输出:
root
|-- id: ınteger (nullable = false)
|-- user_id: ınteger (nullable = false)
|-- star: ınteger (nullable = false)
|-- product_id: ınteger (nullable = false)
我试图得到具体列,但它提出了一个数值错误。
validation_for_predict_rdd = validation_rdd.map(
lambda x: (x.user_id, x.product_id)
)
错误输出:
raise ValueError("Could not parse datatype: %s" % json_value)
ValueError: Could not parse datatype: ınteger
我试图定义一个自定义模式来解决。但是JDBC不允许使用自定义模式。
custom_schema = StructType([
StructField("id", LongType(), False),
StructField("user_id", LongType(), False),
StructField("star", LongType(), False),
StructField("product_id", LongType(), False)])
df = sql_context.read.format('jdbc').options(
url=db_url,
dbtable=db_table, driver="org.postgresql.Driver"
).load(schema=custom_schema)
错误输出:
raise AnalysisException(s.split(': ', 1)[1], stackTrace)
pyspark.sql.utils.AnalysisException: 'jdbc does not allow user-specified schemas.;'
什么是为 “整数” 值错误的解决方案?我可以更改数据库字段类型,但这不是一个合适的解决方案。
您可以使用'pgsql'连接到数据库并执行'DESCRIBE TABLE'吗?我怀疑它可能与数据库或表的编码有关。 –
CREATE DATABASE buyexpress_service_layer WITH OWNER = postgres的 ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'Turkish_Turkey.1254' LC_CTYPE = 'Turkish_Turkey.1254' 连接限制= -1; –
啊! 'LC_'正在搞乱你的Spark应用程序(!)在开始你的'pyspark'或'spark-submit'之前,你可以使用'LC_ALL = en_US.UTF-8'和'LANG = en_US.UTF-8'来改变它吗? –