여기에 도움이 필요합니다. Hive / CSV에서 데이터를 읽으려고합니다. 유형이 문자열이고 값이 json 형식 문자열 인 열이 있습니다. 다음과 같습니다.
| Column Name A |
|----------------------------------------------------------|
|"{"key":{"data":{"key_1":{"key_A":[123]},"key_2":[456]}}}"|
key_2의 값을 가져 와서 새 열에 삽입하려면 어떻게해야합니까?
Gson을 통해 값을 얻는 새로운 기능을 만들려고했습니다.
private BigDecimal getValue(final String columnValue){
JsonObject jsonObject = JsonParser.parseString(columnValue).getAsJsonOBject();
return jsonObject.get("key").getAsJsonObject().get("key_1").getAsJsonObject().get("key_2").getAsJsonArray().get(0).getAsBigDecimal();
}
하지만이 방법을 전체 데이터 세트에 어떻게 적용 할 수 있습니까?
나는 다음과 같은 것을 성취하려고 노력했다.
Dataset<Row> ds = souceDataSet.withColumn("New_column", getValue(sourceDataSet.col("Column Name A")));
하지만 데이터 유형이 다르기 때문에 할 수 없습니다 ...
어떤 제안을 주시겠습니까?
고마워! 헥스!
------------------최신 정보---------------------
@Mck가 제안했듯이 get_json_object를 사용했습니다. 내 가치에는"
"{"key":{"data":{"key_1":{"key_A":[123]},"key_2":[456]}}}"
하위 문자열을 사용하여 제거 "
하고 새 문자열을 이와 같이 만들었습니다.
{"key":{"data":{"key_1":{"key_A":[123]},"key_2":[456]}}}
부분 문자열 코드
DataSet<Row> dsA = sourceDataSet.withColumn("Column Name A",expr("substring(Column Name A, 2, length(Column Name A))"))
내가 사용 dsA.show()
하고 데이터 세트가 올바른지 보이는 확인했다.
그런 다음 다음 코드를 사용하여 시도했습니다.
Dataset<Row> ds = dsA.withColumn("New_column",get_json_object(dsA.col("Column Name A"), "$.key.data.key_2[0]"));
반환합니다 null
.
그러나 데이터가 다음과 같은 경우 :
{"key":{"data":{"key_2":[456]}}}
나는 가치 456을 얻을 수 있습니다.
내가 null을 얻는 이유에 대한 제안이 있습니까? 도움을위한 Thx!
사용 get_json_object
:
ds.withColumn(
"New_column",
get_json_object(
col("Column Name A").substr(lit(2), length(col("Column Name A")) - 2),
"$.key.data.key_2[0]")
).show(false)
+----------------------------------------------------------+----------+
|Column Name A |New_column|
+----------------------------------------------------------+----------+
|"{"key":{"data":{"key_1":{"key_A":[123]},"key_2":[456]}}}"|456 |
+----------------------------------------------------------+----------+
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다