У меня есть следующие CSV-файлы, которые я импортирую в H2OFrames.
CSV 1 (a):
year,manufacturer,model,salePrice
2010,HONDA,CIVIC,100
2011,TOYOTA,CAMRY,150
2010,HONDA,CIVIC,50
2011,TOYOTA,CAMRY,200
2010,HONDA,CIVIC,150
2011,TOYOTA,CAMRY,250
2012,SUZUKI,SWIFT,500
2012,SUZUKI,SWIFT,600
CSV 1 (b):
manufacturer,model,year,salePrice
HONDA,CIVIC,2010,100
TOYOTA,CAMRY,2011,150
HONDA,CIVIC,2010,50
TOYOTA,CAMRY,2011,200
HONDA,CIVIC,2010,150
TOYOTA,CAMRY,2011,250
SUZUKI,SWIFT,2012,500
SUZUKI,SWIFT,2012,600
CSV 2:
year,manufacturer,model,bodyType
2010,HONDA,CIVIC,SEDAN
2011,TOYOTA,CAMRY,SEDAN
2012,SUZUKI,SWIFT,HATCHBACK
Обратите внимание, что«1a» и «1b» - это абсолютно одинаковые данные, только столбцы упорядочены по-разному.Теперь я импортирую все три из них в H2OFrame
следующим образом:
import h2o
h2o.init()
df1a=h2o.import_file('csv1a.csv')
df1b=h2o.import_file('csv1b.csv')
df2=h2o.import_file('csv2.csv')
И затем я пытаюсь выполнить следующие операции слияния:
merge1=df1a.merge(df2, by_x=['year','manufacturer','model'], by_y=['year','manufacturer','model'])
merge2=df1b.merge(df2, by_x=['year','manufacturer','model'], by_y=['year','manufacturer','model'])
Первое слияние работает, как и ожидалось.Но второй сбой с ошибкой «Объединение столбцов должно быть одного типа, столбец salePrice обнаружил типы Enum и Numeric»
Когда я проверил журналы на сервере h2o, я обнаружил, что индексы столбцов by_x
отправленына сервере были одинаковыми для обоих слияний (и упорядочены - [0 1 2]
), несмотря на разный порядок, в котором столбцы by_x
встречаются в df1b
.Из журналов сервера ..
parms={ast=(tmp= py_5_sid_abdb (merge h2o_bug_df1b1.hex h2o_bug_df21.hex False False [0 1 2] [0 1 2] 'auto'))
Затем я нашел строки # 1967 и # 3422 в коде модуля h2o.frame
: https://github.com/h2oai/h2o-3/blob/jenkins-rel-yates-4/h2o-py/h2o/frame.py#L1967 https://github.com/h2oai/h2o-3/blob/jenkins-rel-yates-4/h2o-py/h2o/frame.py#L3422
ДляМое второе слияние, индексы столбцов by_x
должны были быть [2 0 1]
, вместо этого клиент Python отправил [0 1 2]
из-за оператора list(set(tmp))
в строке # 3422.
Поэтому мне интересно, не лучше ли быстро потерпеть неудачу и выдать ошибку, если поставляемые имена столбцов by_x
или by_y
не являются уникальными, вместо того, чтобы собирать их в set
что явно не сохранит порядок?
Также сообщение об ошибке вводило в заблуждение, пока я не проверил код, поскольку сообщение содержало ссылку на столбец salePrice
, которого не было ни в моих by_x
, ни by_y
.