hive - 在 Datalab 中查询 Hive 表时出现问题

标签 hive google-cloud-dataproc google-cloud-datalab

我已经创建了一个带有更新的 init 操作的 dataproc 集群来安装 datalab。

一切正常,除了当我从 Datalab 笔记本查询 Hive 表时,我遇到了

hc.sql(“””select * from invoices limit 10”””)

"java.lang.ClassNotFoundException: Class com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem not found" exception

创建集群

gcloud beta dataproc clusters create ds-cluster \
--project my-exercise-project \
--region us-west1 \
--zone us-west1-b \
--bucket dataproc-datalab \
--scopes cloud-platform  \
--num-workers 2  \
--enable-component-gateway  \
--initialization-actions gs://dataproc_mybucket/datalab-updated.sh,gs://dataproc-initialization-actions/connectors/connectors.sh  \
--metadata 'CONDA_PACKAGES="python==3.5"'  \
--metadata gcs-connector-version=1.9.11  

datalab-updated.sh

  -v "${DATALAB_DIR}:/content/datalab" ${VOLUME_FLAGS} datalab-pyspark; then
    mkdir -p ${HOME}/datalab
    gcloud source repos clone datalab-notebooks ${HOME}/datalab/notebooks

在数据实验室笔记本中

from pyspark.sql import HiveContext
hc=HiveContext(sc)
hc.sql("""show tables in default""").show()
hc.sql(“””CREATE EXTERNAL TABLE IF NOT EXISTS INVOICES
      (SubmissionDate DATE, TransactionAmount DOUBLE, TransactionType STRING)
      STORED AS PARQUET
      LOCATION 'gs://my-exercise-project-ds-team/datasets/invoices’”””)
hc.sql(“””select * from invoices limit 10”””)

更新

spark._jsc.hadoopConfiguration().set('fs.gs.impl', 'com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem')
spark._jsc.hadoopConfiguration().set('fs.gs.auth.service.account.enable', 'true')
spark._jsc.hadoopConfiguration().set('google.cloud.auth.service.account.json.keyfile', "~/Downloads/my-exercise-project-f47054fc6fd8.json")

更新 2 (datalab-updated.sh)

function run_datalab(){
  if docker run -d --restart always --net=host  \
      -v "${DATALAB_DIR}:/content/datalab" ${VOLUME_FLAGS} datalab-pyspark; then
    mkdir -p ${HOME}/datalab
    gcloud source repos clone datalab-notebooks ${HOME}/datalab/notebooks
    echo 'Cloud Datalab Jupyter server successfully deployed.'
  else
    err 'Failed to run Cloud Datalab'
  fi
}

最佳答案

你应该使用 Datalab initialization action在 Dataproc 集群上安装 Datalab:

gcloud dataproc clusters create ${CLUSTER} \
    --image-version=1.3 \
    --scopes cloud-platform \
    --initialization-actions=gs://dataproc-initialization-actions/datalab/datalab.sh

此 Hive 在 Datalab 中开箱即用地使用 GCS 后:

from pyspark.sql import HiveContext
hc=HiveContext(sc)
hc.sql("""SHOW TABLES IN default""").show()

输出:

+--------+---------+-----------+
|database|tableName|isTemporary|
+--------+---------+-----------+
+--------+---------+-----------+

在 Datalab 中使用 Hive 在 GCS 上创建外部表:

hc.sql("""CREATE EXTERNAL TABLE IF NOT EXISTS INVOICES
      (SubmissionDate DATE, TransactionAmount DOUBLE, TransactionType STRING)
      STORED AS PARQUET
      LOCATION 'gs://<BUCKET>/datasets/invoices'""")

输出:

DataFrame[]

在 Datalab 中使用 Hive 查询 GCS 表:

hc.sql("""SELECT * FROM invoices LIMIT 10""")

输出:

DataFrame[SubmissionDate: date, TransactionAmount: double, TransactionType: string]

关于hive - 在 Datalab 中查询 Hive 表时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55944773/

相关文章:

python - 从 Spark/Dataproc 将 .txt 文件写入 GCS : How to write only one large file instead of it automatically splitting in to multiple?

python - 使用 Google Cloud Datalab 时如何将 .gz 文件加载到 BigQuery?

hive - 使用一个文件在 Hive 中创建表

email - 如何在没有 SMTP 的情况下通过 dataproc 集群发送带附件的邮件?

google-cloud-platform - 如何在 Google Dataproc 上安排 Spark 作业?

python - 安装python库后无法连接到google cloud datalab

google-bigquery - Datalab 创建返回 STRUCT 的 BigQuery UDF

hadoop - Oozie Hive 操作在 SerDe 上失败

hadoop - 使用 Hive Sed 命令加载数据

apache-spark - Hive unix_timestamp 在源列中的毫秒数不起作用