我正在使用
org.apache.hive.jdbc.HiveDriver
从配置单元读取数据,我正在尝试传递此属性:
hive.resultset.use.unique.column.names = false
在配置字典中:
jdbc_url = f"jdbc:hive2://{cluster_name}:443/default;transportMode=http;ssl=true;httpPath=/hive2;http.header.Connection=close"
hive_cfg = {
"url": jdbc_url,
"driver": "org.apache.hive.jdbc.HiveDriver",
"user": storage_account_name,
"password": storage_account_access_key,
"inferSchema": True,
# "query": query,
"dbtable": "schema_name.table_name",
"properties": {"hive.resultset.use.unique.column.names": "false"}
}
page_views_df = spark.read.format("jdbc").options(**hive_cfg).load()
或
spark.conf.set("hive.resultset.use.unique.column.names", False)
要从输出列中删除 table_name:
table_name.column_name -> column_name
但它不起作用:
我已经有一个函数可以处理这个问题了:
def remove_table_name_prefix_in_column_name(df, columns):
for col_name in columns:
new_col_name = col_name.split(".")[1]
df = df.withColumnRenamed(col_name, new_col_name)
return df
它可以工作,但我有更多想要传递的属性,我正在使用这个来测试驱动程序是否实际上正在读取这些属性,因为它不起作用,我怀疑它会在我使用它们时读取我拥有的其他属性。
我的配置/属性有问题还是有其他方法来设置此属性?
您无法在不重新启动会话(或上下文?)的情况下更改 Spark 配置。因此,将其传递到 CLI 上,或者将其放入
$SPARK_HOME/conf/spark.conf
。
spark-shell --conf hive.resultset.use.unique.column.names=false
# or spark-submit --conf ...
您可能还需要在配置名称前添加
spark.
前缀,具体取决于配置名称。请阅读 Spark 配置指南中的自定义 Hadoop/Hive 配置。所以也许
spark-shell --conf spark.hive.resultset.use.unique.column.names=false
您可以重新启动上下文并创建新会话,但无法更新现有会话/上下文。