[英]How to write a spark.sql.dataframe into a S3 bucket in databricks?
[英]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()
29createDataFrame中的/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對象。 但是您不能直接將結果docs
從client.ReadDocuments
方法作為參數data
傳遞給函數SparkSession.createDataFrame(data, schema=None, samplingRatio=None, verifySchema=True)
,因為數據類型不同,如下所示。
函數createDataFrame
需要一個參數data
,該data
必須是RDD
或list
或pandas.DataFrame
但是,我從https://pypi.org/project/pydocumentdb/#files下載了pydocumentdb-2.3.3.tar.gz
的源代碼,並查看了代碼文件document_client.py
和query_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 Documents
從ReadDocuments
方法,然后通過創建一個數據框PySpark對象spark.createDataFrame(pandas_df)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.