簡體   English   中英

如何在Databricks中閱讀Azure CosmosDb Collection並寫入Spark DataFrame

[英]How to read Azure CosmosDb Collection in Databricks and write to a Spark DataFrame

我正在查詢CosmosDb集合,並且能夠打印結果。 當我嘗試將結果存儲到Spark DataFrame時,它會失敗。

以此網站為例:

如何在python中從Azure的CosmosDB中讀取數據

按照上面的確切步驟鏈接。 另外,嘗試以下

 df = spark.createDataFrame(dataset)

這會引發此錯誤:

ValueError:推斷后無法確定某些類型

ValueError Traceback(最近一次調用最后一次)
in()
25打印(數據集)
26
---> 27 df = spark.createDataFrame(dataset)
28 df.show()
29

createDataFrame中的/databricks/spark/python/pyspark/sql/session.py(self,data,schema,samplingRatio,verifySchema)
808 rdd,schema = self._createFromRDD(data.map(prepare),schema,samplingRatio)
809其他:
- > 810 rdd,schema = self._createFromLocal(map(prepare,data),schema)
811 jrdd = self._jvm.SerDeUtil.toJavaArray(rdd._to_java_object_rdd())
812 jdf = self._jsparkSession.applySchemaToPythonRDD(jrdd.rdd(),schema.json())

_createFromLocal中的/databricks/spark/python/pyspark/sql/session.py(self,data,schema)
440寫臨時文件。
441“”“
- > 442 data,schema = self._wrap_data_schema(data,schema)
443返回self._sc.parallelize(data),schema

但是,希望將其另存為Spark DataFrame

任何幫助將非常感激。 謝謝!>

為了推斷字段類型,PySpark查看每個字段中的非none記錄。 如果某個字段只有None記錄,則PySpark無法推斷該類型並會引發該錯誤。

手動定義架構將解決該問題

>>> from pyspark.sql.types import StructType, StructField, StringType
>>> schema = StructType([StructField("foo", StringType(), True)])
>>> df = spark.createDataFrame([[None]], schema=schema)
>>> df.show()
+----+
|foo |
+----+
|null|
+----+

希望能幫助到你。

我看到你使用舊的Python SDK for DocumentDB來跟蹤我之前的答案,以查詢CosmosDB文檔以創建PySpark DataFrame對象。 但是您不能直接將結果docsclient.ReadDocuments方法作為參數data傳遞給函數SparkSession.createDataFrame(data, schema=None, samplingRatio=None, verifySchema=True) ,因為數據類型不同,如下所示。

函數createDataFrame需要一個參數data ,該data必須是RDDlistpandas.DataFrame

在此輸入圖像描述

但是,我從https://pypi.org/project/pydocumentdb/#files下載了pydocumentdb-2.3.3.tar.gz的源代碼,並查看了代碼文件document_client.pyquery_iterable.py

# from document_client.py
def ReadDocuments(self, collection_link, feed_options=None):
    """Reads all documents in a collection.

    :param str collection_link:
        The link to the document collection.
    :param dict feed_options:

    :return:
        Query Iterable of Documents.
    :rtype:
        query_iterable.QueryIterable

    """
    if feed_options is None:
        feed_options = {}

    return self.QueryDocuments(collection_link, None, feed_options)

# query_iterable.py
class QueryIterable(object):
    """Represents an iterable object of the query results.
    QueryIterable is a wrapper for query execution context.
    """

因此,要解決您的問題,你必須創建一個pandas.DataFrame首先通過迭代對象的結果Query Iterable of DocumentsReadDocuments方法,然后通過創建一個數據框PySpark對象spark.createDataFrame(pandas_df)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM