我試圖用自動裝卸機添加一個csv文件到三角洲表。底層的csv文件空間的屬性名稱(即。“帳號”,而不是“AccountNumber”)。當我運行我的自動裝載,我得到以下錯誤信息:
發現無效的字符(s)的,{}()\ n \ t = '列名的模式。
我的自動裝載方法是:
(火花。readStream .format .option (“cloudFiles (“cloudFiles”)。格式”、“csv”) .option (“cloudFiles。schemaLocation”, checkpoint_directory) .option(“標題”、“True”) .load (data_source) .writeStream .format(“δ”).trigger(一旦= True) .option (“checkpointLocation”, checkpoint_directory) .option (“mergeSchema”、“True”) .table (table_name))
建議的解決方案通過錯誤消息是改變列映射模式名稱的映射表中的屬性允許空間:
ALTER TABLE < table_name >設置TBLPROPERTIES(δ。minReaderVersion ' = ' 2 ', '三角洲。minWriterVersion ' = ' 5 ', ' delta.columnMapping。模式' = '名稱')
這個問題我有才就是表創建自動裝卸機,所以我不能改變表的屬性。我的問題是在兩個部分:
a我可以創建一個空白的三角洲表,這樣我就可以改變表屬性之前,半自動的跑步?例如,我可以運行:
如果不存在table_name創建或替換表
這將允許我改變表,然後運行自動裝卸機,這樣我就可以攝取csv屬性名稱中使用空格。
b還有另一種方法(可能混疊在spark.readStream)請允許我攝取這些華禾投資屬性名稱中使用空格,而不需要有一個現有表調整表屬性?
@Hubert杜德克謝謝你的回應!我能夠使用您上麵提出的生成模式。問題是,模式將所有屬性設置為字符串值和重命名它們數值(‘_c0’,‘_c1’,等等)。雖然這讓我們寫流,它不準確的描述或屬性名稱的模式。如果我不是使用:
csvFile = spark.read。選項(頭=‘真正的’,inferSchema = '真的'). csv (data_source)
然後我可以改變屬性名稱:
json_str = json.dumps json_str = json_str (schema_json)。替換(" "," ")schema_json = json.loads (json_str)
然後我們可以創建ddl和通過readStream的模式。
模式,隻是閱讀你的CSV dataframe不流,把它
csvFile = spark.read.csv (yourfile) csvFile .createOrReplaceTempView (“csvFile”) schema_json =火花。sql (“SELECT * FROM csvFile”) .schema.json ddl () = spark.sparkContext._jvm.org.apache.spark.sql.types.DataType.fromJson (schema_json) .toDDL()打印(ddl)
@Hubert杜德克謝謝你的回應!我能夠使用您上麵提出的生成模式。問題是,模式將所有屬性設置為字符串值和重命名它們數值(‘_c0’,‘_c1’,等等)。雖然這讓我們寫流,它不準確的描述或屬性名稱的模式。如果我不是使用:
csvFile = spark.read。選項(頭=‘真正的’,inferSchema = '真的'). csv (data_source)
然後我可以改變屬性名稱:
json_str = json.dumps json_str = json_str (schema_json)。替換(" "," ")schema_json = json.loads (json_str)
然後我們可以創建ddl和通過readStream的模式。